我使用两个命令:
awk '{ print $2 }' SomeFile.txt > Pattern.txt
grep -f Pattern.txt File.txt
使用第一个命令,我创建了一个理想模式列表。使用第二个命令,我提取File.txt中与Pattern.txt
中的行匹配的所有行我的问题是,有没有办法在管道中组合awk和grep,这样我就不必生成中间的Pattern.txt文件了?
谢谢!
答案 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
bash
和zsh
会支持这一点,其他人也可能会支持,但未经过测试。
如上所述更简单并且所有shell都支持使用管道:
awk '{ print $2 }' SomeFile.txt | grep -f - File.txt
-
用作-f
的参数。 -
在此处有特殊含义,代表stdin
。感谢Tom Fenech
提及!