如何将两个文件合并为替代行?

如何将两个文件合并为替代行?

我知道如何合并两个表以在新文件中打印替代行,但我想将 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.txtpastefile1.txtfile2.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

相关内容