2016-07-27 48 views
2

我要寻找一个awk或sed的解决方案相结合基础上匹配的模式2个文件,就像这样:在这种情况下,该模式是“猫”。在文件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 
+3

你有试过什么吗? – haifzhan

+1

如果'file1'应该包含发生什么'这是一个catch'或'我是一个cat.'或任何十几左右的其他有趣的情况下,你还没有包含在你的样品输入/输出?你的问题展示如何处理最坏的情况,而不仅仅是最好的。 –

回答

2

试试这个awk的一个班轮:

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 
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

您使用了{getline this <“file2”; print this}而不是'{getline <“file2”; print}''的任何特定原因。 – thecomebackid

+0

@thecomebackid ...呃,是的。因为这行代码是从[类似的答案](http://stackoverflow.com/a/36270120/1072112)中回收的,它将'1'放在脚本的END而不是开头,因此一个纯粹的'getline'会已经从'file1'覆盖了当前行。非常棒!尽管如此,我会留下这个答案,因为如果数据存储在变量中,可能更容易扩展到分析数据的东西。 – ghoti

+0

我明白了,谢谢@ ghoti – thecomebackid