使用sed或awk在两个文件之间插入行

时间:2017-05-10 13:15:24

标签: bash sed

我有两个文件,文件A和文件B:

在fileA.txt内:

lineA
lineB
lineC
lineD
lineE

并在fileB.txt内:

object1
object2

预期结果:

lineA
lineB
object1
lineC
lineD
object2
lineE

我因为重叠两个文件而迷失了,它是一个小文件,因此它不一定非常自动。我试着做这样的事情:

cat fileA.txt | sed -n 1p >> fileB.txt | 3p?
cat fileA.txt | sed -n 2p >> fileB.txt | 6p?

请帮助

5 个答案:

答案 0 :(得分:4)

如果文件A中的每两行都插入一行文件B,则可以使用此GNU sed

sed 'n;R file2' file1

<强>输出:

$ sed 'n;R file2' file1
lineA
lineB
object1
lineC
lineD
object2
lineE

来自man sed

  

R filename

     

附加从文件名读取的行。每次调用该命令都会从文件中读取一行。这是 GNU 扩展名。

答案 1 :(得分:2)

sed用于单个行上的简单替换,即全部。如果你使用s,g和p以外的sed结构(使用-n)那么你使用的是错误的工具。对于任何其他文本操作问题,您应该使用awk以获得清晰,简单,可移植性,效率以及软件的大多数其他理想属性:

$ awk 'NR==FNR{a[NR]=$0;next} {print} FNR%2==0{print a[++c]}' fileB fileA
lineA
lineB
object1
lineC
lineD
object2
lineE

答案 2 :(得分:1)

sed '0~2 R file_name_2'  file_name_1
  

0~2 - 每隔一行后

     

R filename - 附加从filename读取的行。每次调用   命令从文件中读取一行。

答案 3 :(得分:0)

尝试:

awk 'FNR==NR{A[FNR]=$0;next} {printf("%s%s\n",$0,FNR%2==0?ORS A[++i]:"")}' fileB.txt fileA.txt

检查FNR == NR条件,当读取文件fileB.txt时,该条件为TRUE。它创建了一个名为A的数组,其索引是行号,它的值是fileB.txt行的当前行。当读取名为fileB.txt的文件时,next将跳过所有进一步的语句。 打印fileA.txt的当前行并检查条件,如果FNR%2 == 0,则使用增加的变量I值打印数组A的值。

lineA
lineB
object1
lineC
lineD
object2
lineE

答案 4 :(得分:0)

awk中的另一个,使用mod(%)和getline

awk '1;NR%2==0{if((getline line < "fileB")>0)print line}' fileA
lineA
lineB
object1
lineC
lineD
object2
lineE

fileA中的每一行后,如果有任何内容,请从fileB打印一行。