我正在使用两个命令:
awk '{ print $2 }' SomeFile.txt > Pattern.txt
grep -f Pattern.txt File.txt
使用第一个命令,我创建了一个所需模式的列表。使用第二个命令,我提取 File.txt 中与 Pattern.txt 中的行匹配的所有行
我的问题是,有没有办法在管道中组合 awk 和 grep,这样我就不必生成中间 Pattern.txt 文件?
谢谢!
最佳答案
您可以一次调用 awk 来完成所有这些:
awk 'NR==FNR{a[$2];next}{for(i in a)if($0~i)print}' Somefile.txt File.txt
从第一个文件的第二列填充数组 a
中的键。 NR==FNR
标识第一个文件(总记录数等于该文件的记录数)。 next
跳过第一个文件的第二个 block 。
在第二个 block 中,遍历数组中的所有键,如果该行匹配其中任何一个,则打印它。为了避免在匹配多个模式时多次打印该行,您也可以在此处添加 next
,即 {for(i in a)if($0~i){print ;下一个}}
。
如果“模式”实际上是固定的字符串,那就更简单了:
awk 'NR==FNR{a[$2];next}$0 in a' Somefile.txt File.txt
关于awk - 结合 grep -f 和 awk,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29212476/