找到 PATTERN 时合并两个文本文件的行
Merge lines of two text files when PATTERN is found
我正在寻找一个 awk 或 sed 解决方案来根据匹配的模式组合 2 个文件,如下所示:本例中的模式是 "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
试试这个 awk 一行:
awk 'NR==FNR{a[NR]=[=10=];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]=[=11=];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
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
读取并打印它。您的内存占用仍然很小,因为您没有使用其中一个文件的内容填充数组。
我正在寻找一个 awk 或 sed 解决方案来根据匹配的模式组合 2 个文件,如下所示:本例中的模式是 "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
试试这个 awk 一行:
awk 'NR==FNR{a[NR]=[=10=];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]=[=11=];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
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
读取并打印它。您的内存占用仍然很小,因为您没有使用其中一个文件的内容填充数组。