cat file_1
my colour is red
my rose is red
my colour is blue
my rose id blue
cat file_2
red
blue
cat output_file should be
my colour is red
my colour is blue
我在这里使用
cat file_2 | while read line;do cat file_1 | grep "$line" | head -1;done
在这里,我试图获取包含pattern "red" and "blue"
存在于中的最上面的行file_2
还有其他方法吗,,as fast as possible
while 循环需要时间
答案1
您可以使用while
构造来循环 from 的模式file2
,然后使用-m 1
withgrep
在第一次匹配后停止file1
:
while IFS= read -r i; do grep -Fm1 "$i" file1; done <file2
-F
从字面上对待模式-m 1
使grep
第一场比赛后退出
Shell 循环通常效率不高,但由于模式列表很小,因此在这种情况下是可用的。
更快的替代方案, xargs
:
xargs -a file2 -n1 -P2 -I'{}' grep -Fm1 {} file1
使用更多并行进程 ( -P
) 以获得更多模式。
例子:
% while IFS= read -r i; do grep -Fm1 "$i" file1; done <file2
my colour is red
my colour is blue
% xargs -a file2 -n1 -P2 -I'{}' grep -Fm1 {} file1
my colour is blue
my colour is red
答案2
要打印 file_1 中与 file_2 中的行匹配的第一行:
$ awk 'FNR==NR{a[$0];next} {for (line in a) if ($0~line) {print; delete a[line]}}' file_2 file_1
my colour is red
my colour is blue
这种方法只读取每个文件一次。
怎么运行的
FNR==NR{a[$0];next}
这会将 file_2 中的每一行保存为关联数组中的键
a
。for (line in a) if ($0~line) {print; delete a[line]}
对于 file_1 中的每一行,我们检查它是否与 array 中的键匹配
a
。如果是,我们打印该行并删除该密钥。