【问题标题】:awk to match pattern from a file to another fileawk 将模式从一个文件匹配到另一个文件
【发布时间】:2017-09-13 13:38:59
【问题描述】:

要在文件中查找字符串并打印输出的第一列,我们可以使用

grep "foo" file.txt | awk '{print $1}' 可以单独使用awk 完成

awk '/foo/ {print $1}' file.txt (https://stackoverflow.com/a/22866418/1662898)。

我想在文件中搜索字符串列表,而不是将单个字符串 (foo) 作为模式。使用grep,会是

grep -f file.txt file2.txt | awk '{print $1}' > outFile.txt

我可以单独使用awk 做同样的事情吗?

file.txt
abcd
acde
a2rt

file2.txt
1 albcd dhakd kdf
3 abcdbd and
2a bda2rt tert

outFile.txt
3
2a

谢谢! 阿布舍克

【问题讨论】:

  • file.txt和file2.txt中您要比较哪些列,请在信息中说清楚,以便我们尽力帮助您。
  • file.txt 每行和 file2.txt 中的任何位置都包含一个字符串(模式)(没有特定的列。
  • grep -f -F 是多余的。

标签: linux bash shell awk


【解决方案1】:

等效的awk 命令将是这个:

awk 'NR==FNR{a[$1]; next} {for (i in a) if (index($0, i)) print $1}' file.txt file1.txt

输出:

3
2a

由于grep-F 选项,使用非正则表达式字符串比较(index($0, i)) 而不是正则表达式匹配($0 ~ i)

【讨论】:

  • 您能否更详细地解释一下这里发生了什么?
  • 在第一遍中,我们构建了一个第一列为file.txt 的数组。在第二遍中,我们遍历数组并检查数组条目是否是来自第二个文件的整行的子字符串
  • 警告:这不适用于正则表达式。 gnu.org/software/gawk/manual/html_node/String-Functions.html index(in, find) 在字符串 in 中搜索第一次出现的字符串 find,并返回在字符串 in 中该出现开始的字符位置。$ awk 'BEGIN { print index("peanut", "an") }' ==> -| 3 如果未找到 find,则 index() 返回零。对于 BWK awk 和 gawk,使用正则表达式常量进行查找是一个致命错误。其他实现允许它,只需将 regexp 常量视为表示“$0 ~ /regexp/”的表达式。 (直流)
  • 抱歉这里没有真正理解正则表达式的上下文。
猜你喜欢
  • 2013-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-03
  • 2021-08-05
  • 2014-05-27
  • 2023-03-10
相关资源
最近更新 更多