结合grep -f和awk

时间:2015-03-23 14:12:45

标签: awk grep

我使用两个命令:

awk '{ print $2 }' SomeFile.txt > Pattern.txt

grep -f Pattern.txt File.txt

使用第一个命令,我创建了一个理想模式列表。使用第二个命令,我提取File.txt中与Pattern.txt

中的行匹配的所有行

我的问题是,有没有办法在管道中组合awk和grep,这样我就不必生成中间的Pattern.txt文件了?

谢谢!

2 个答案:

答案 0 :(得分:5)

你可以在awk的一次调用中完成所有这些:

awk 'NR==FNR{a[$2];next}{for(i in a)if($0~i)print}' Somefile.txt File.txt

从第一个文件的第二列填充数组a中的键。 NR==FNR标识第一个文件(总记录数等于此文件的记录号)。 next跳过第一个文件的第二个块。

在第二个块中,循环遍历数组中的所有键,如果该行与其中任何一个匹配,则打印它。要避免在匹配多个模式时多次打印该行,您也可以在此处添加next,即{for(i in a)if($0~i){print;next}}

如果"模式"实际上是固定的字符串,它甚至更简单:

awk 'NR==FNR{a[$2];next}$0 in a' Somefile.txt File.txt

答案 1 :(得分:3)

如果你的shell支持它,你可以使用process substitution

grep -f <(awk '{ print $2 }' SomeFile.txt) File.txt

bashzsh会支持这一点,其他人也可能会支持,但未经过测试。


如上所述更简单并且所有shell都支持使用管道:

awk '{ print $2 }' SomeFile.txt | grep -f - File.txt

-用作-f的参数。 -在此处有特殊含义,代表stdin。感谢Tom Fenech提及!