找到PATTERN时合并两个文本文件的行

时间:2016-07-27 19:24:17

标签: linux shell awk sed tcsh

我正在寻找一个awk或sed解决方案,根据匹配的模式组合2个文件,如下所示:在这种情况下,PATTERN是“cat”。文件2中的行数始终等于文件1中的模式匹配数。

文件1:

I am a cat  
I am a dog    
I am a dog  
I am a cat  
I am a dog

文件2:

line 1  
line 2

合并文件:

I am a cat  
line 1  
I am a dog  
I am a dog  
I am a cat  
line 2  
I am a dog

2 个答案:

答案 0 :(得分:3)

NR==FNR构造非常方便,但如果要加载到内存中的文件非常大,则可能存在风险。

相反,awk可以同时读取两个文件。

$ awk '1; /cat/{getline this<"file2";print this}' file1
I am a cat
line1
I am a dog
I am a dog
I am a cat
line2
I am a dog

程序开头的1打印来自file1的当前行,无论是什么。脚本中的第二个条件检查您的魔术词,然后从file2读取并打印它。您的内存占用空间很小,因为您没有使用其中一个文件的内容填充数组。

答案 1 :(得分:2)

试试这个awk one liner:

awk 'NR==FNR{a[NR]=$0;next}1;/cat/{print a[++i]}' file2 file1

试验:

$ cat file1
I am a cat
I am a dog
I am a dog
I am a cat
I am a dog

$ cat file2
line 1
line 2

$ awk 'NR==FNR{a[NR]=$0;next}1;/cat/{print a[++i]}' file2 file1
I am a cat
line 1
I am a dog
I am a dog
I am a cat
line 2
I am a dog