如何使用 shell 脚本从一个文件中逐行复制并在每 n 行之后粘贴到另一个文件中
how to copy lines one by one from a file and paste then into another file after every n lines using shell script
假设我有 file1 的内容
line1
line2
line3
和另一个包含内容
的文件2
lineA
lineB
lineC
lineD
lineE
lineF
lineG
lineH
lineI
我想将 file2 设为
lineA
lineB
lineC
line1
lineD
lineE
lineF
line2
lineG
lineH
lineI
line3
这个 python 代码可以做到,你的参数是
python interlace.py file1 file2 file3 3
如果您希望它就位,我建议您之后只使用 mv file3 file2
。这是因为如果您在读取所有内容之前开始写入 file2,它可能会被覆盖
import sys
if len(sys.argv[1:]) == 4:
file1 = open(sys.argv[1], 'r')
file2 = open(sys.argv[2], 'r')
file3 = open(sys.argv[3], 'w')
line_count = int(sys.argv[4])
current_counter = 0
for file2_line in file2.readlines():
current_counter += 1
file3.write(file2_line)
if current_counter == line_count:
file3.write(file1.readline())
current_counter = 0
for file1_line in file1.readlines():
file3.write(file1_line)
file3.close()
这也适用于 file1 提前用完行的情况,在这种情况下 file2 的行将照常继续,而当 file1 有额外的行时,它们只会被添加到末尾。
这可能对你有用 (GNU sed):
n=3
sed "$n~$n"'R file1' file2
在 file2 的第三行之后,每隔三行,从 file1 追加一行。
这里有一个方法 paste
cat file2 | paste -d'\n' - - - file1
paste
的破折号参数表示从标准输入读取,即cat file2
输出,而第四个参数是file1
。因此,使用三个破折号,我们将一个文件的每 3 行与另一个文件的 1 行粘贴在一起,分隔符是换行符 (-d'\n'
).
这将适用于任何这些文件中的剩余行的情况,因为当为其中一个输入找到 EOF
时粘贴将继续。但是在这种情况下它可能会打印几个空行,因此您可以通过管道传递给任何命令来删除它们,(假设您的文件中没有实际的空行),例如
cat file2 | paste -d'\n' - - - file1 | sed '/^$/d'
使用 awk 和 getline
:
awk '1;NR%3==0{if((getline < "file1")>0)print}' file2
lineA
lineB
lineC
line1
lineD
...
您可能会将其混淆为 awk '1;NR%3==0&&(getline < "file1")' file2
(未经测试)。
假设我有 file1 的内容
line1
line2
line3
和另一个包含内容
的文件2lineA
lineB
lineC
lineD
lineE
lineF
lineG
lineH
lineI
我想将 file2 设为
lineA
lineB
lineC
line1
lineD
lineE
lineF
line2
lineG
lineH
lineI
line3
这个 python 代码可以做到,你的参数是
python interlace.py file1 file2 file3 3
如果您希望它就位,我建议您之后只使用 mv file3 file2
。这是因为如果您在读取所有内容之前开始写入 file2,它可能会被覆盖
import sys
if len(sys.argv[1:]) == 4:
file1 = open(sys.argv[1], 'r')
file2 = open(sys.argv[2], 'r')
file3 = open(sys.argv[3], 'w')
line_count = int(sys.argv[4])
current_counter = 0
for file2_line in file2.readlines():
current_counter += 1
file3.write(file2_line)
if current_counter == line_count:
file3.write(file1.readline())
current_counter = 0
for file1_line in file1.readlines():
file3.write(file1_line)
file3.close()
这也适用于 file1 提前用完行的情况,在这种情况下 file2 的行将照常继续,而当 file1 有额外的行时,它们只会被添加到末尾。
这可能对你有用 (GNU sed):
n=3
sed "$n~$n"'R file1' file2
在 file2 的第三行之后,每隔三行,从 file1 追加一行。
这里有一个方法 paste
cat file2 | paste -d'\n' - - - file1
paste
的破折号参数表示从标准输入读取,即cat file2
输出,而第四个参数是file1
。因此,使用三个破折号,我们将一个文件的每 3 行与另一个文件的 1 行粘贴在一起,分隔符是换行符 (-d'\n'
).
这将适用于任何这些文件中的剩余行的情况,因为当为其中一个输入找到 EOF
时粘贴将继续。但是在这种情况下它可能会打印几个空行,因此您可以通过管道传递给任何命令来删除它们,(假设您的文件中没有实际的空行),例如
cat file2 | paste -d'\n' - - - file1 | sed '/^$/d'
使用 awk 和 getline
:
awk '1;NR%3==0{if((getline < "file1")>0)print}' file2
lineA
lineB
lineC
line1
lineD
...
您可能会将其混淆为 awk '1;NR%3==0&&(getline < "file1")' file2
(未经测试)。