我使用两个命令:
awk '{ print $2 }' SomeFile.txt > Pattern.txt
grep -f Pattern.txt File.txt
Run Code Online (Sandbox Code Playgroud)
使用第一个命令,我创建了一个理想模式列表.使用第二个命令,我提取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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)