我知道如何合并两个表以在新文件中打印替代行,但我想将 file1.txt 中的每两行与 file2.txt 中的一行合并。例如:
file1.txt 是
A a aa
B b bb
C c cc
D d dd
并且 file2.txt 是
E e ee
F f ff
我希望有
A a aa
B b bb
E e ee
C c cc
D d dd
F f ff
答案1
使用 GNU sed,您可以读取第二个文件中的一行,并在第一个文件中每隔一行(“两行跳过两行”)后插入一行:
$ sed '2~2R file2.txt' file1.txt
A a aa
B b bb
E e ee
C c cc
D d dd
F f ff
在 awk 中实现同样的功能略显冗长:
awk '{print} !(NR%2) {if ((getline < "file2.txt") > -1) print}' file1.txt
答案2
您可以使用paste
以下命令:
% paste -d '\n' - - file2.txt < file1.txt
A a aa
B b bb
E e ee
C c cc
D d dd
F f ff
paste
默认情况下,从每个输入文件中获取行,然后将它们合并为以制表符分隔的一行。使用-d '\n'
,我们告诉它改用换行符作为分隔符。是标准输入,它从( )-
重定向到。因此,从标准输入中获取一行,然后从标准输入中获取另一行(实际上是从中获取两行,然后从中获取一行,并以换行符分隔它们打印出来。file1.txt
< file1.txt
paste
file1.txt
file2.txt
答案3
原始 shellscript
我认为以下 shellscript 可以做到这一点。诀窍是在不同的文件描述符上打开这两个文件(此处为 #4 和 #5)。
#!/bin/bash
while read -r -u 4 line1 && read -r -u 4 line2 && read -r -u 5 line3
do
echo "$line1"
echo "$line2"
echo "$line3"
done 4<file1.txt 5<file2.txt
测试
使 shellscript 可执行并运行它,
$ ./myscript
A a aa
B b bb
E e ee
C c cc
D d dd
F f ff
当读取到其中一个输入文件的文件末尾时,原始 shellscript 会停止(这样只有匹配的 2+1 行会写入输出)。
修改后的 shellscript
以下 shellscript 将继续读取和写入,直到所有文件都到达文件末尾(以便所有可用行都写入输出)。这应该符合 OP 的要求。
#!/bin/bash
end1=false
end2=false
cont=true
while $cont
do
read -r -u 4 line1
if [ $? -eq 0 ]
then
echo "$line1"
else
end1=true
fi
read -r -u 4 line2
if [ $? -eq 0 ]
then
echo "$line2"
else
end1=true
fi
read -r -u 5 line3
if [ $? -eq 0 ]
then
echo "$line3"
else
end2=true
fi
if $end1 && $end2 # modify this line to change when to stop
then
cont=false
fi
done 4<file1.txt 5<file2.txt