awk - 结合 grep -f 和 awk

标签 awk grep

我正在使用两个命令:

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/

相关文章:

arrays - 如何使用AWK正确打印循环中的关联数组?

linux - 关于两种情况之间的 grep 选项

hadoop - 计算大于 100MB 的 hdfs 压缩文件

linux - 当 grep "\\"XXFile 我得到 "Trailing Backslash"

javascript - 过滤数组以获取对象键的子集

linux - AWK 在 Bash 脚本中不起作用

linux - 我如何比较 3 个文件(以查看它们之间的共同点)?

bash - 如何删除整个文件中的双行,省略每行中的前 n 个字符?

bash - 我的 awk 用户函数无法在 bash 脚本中运行

linux - 重击 : Loop a file until it reaches specific number of matching strings and start over