【问题标题】:How to use grep via awk?如何通过 awk 使用 grep?
【发布时间】:2014-01-12 10:13:52
【问题描述】:

我正在尝试对一个大文件中的几个字符串应用 grep。但是,我想通过 awk 脚本将该行传递给 grep 命令。我还希望将输出重定向到脚本。 我有一个从文件中读取记录的 awk 脚本。我希望 grep 仅应用于少数记录。当前记录 $0 将是要使用 grep 的文本。 我该怎么做?目前,我正在尝试这个 -

system("grep --count -w 'GOOD' \n" $0)

但是,它似乎不起作用。我应该使用什么?

【问题讨论】:

  • 最好向我们展示一些数据,您喜欢其中的哪些内容以及如何到达那里。通过这种方式,我们可以帮助您制定解决方案。我认为awk 中不需要grep,它应该可以做到。
  • 很少需要 grep 来自 awk 的输出,因为 awk 非常灵活和强大,它可以做 grep 可以做的所有事情,甚至更多
  • @FredrikPihl 是对的。正如您所说,如果您有一个“巨大”文件,那么对于每一行,您都会启动一个 grep 进程。 grep 很快,但想想 10m 行。将您的 grep 逻辑合并到您的 awk 中,可能会获得更好的性能。从您目前对问题的描述来看,要求相当模糊。
  • awk 不允许我计算该特定记录中正则表达式匹配的出现次数。我可能必须为此编写一个函数。虽然现在这比使用 grep 更有意义。
  • @user657592 有很多方法可以使用 awk 获取记录的正则表达式匹配计数。

标签: awk grep gawk


【解决方案1】:

在 Gnu Awk 中,您可以使用 \<\> 来匹配单词的开头和结尾,所以

gawk '/\<GOOD\>/{++i} END{print i}'

会做同样的事情

grep -wc 'GOOD' file

如果您想计算单词GOOD 的出现总数(不仅是行数,还包括给定行/记录中的出现次数),您可以在 Gnu Awk 版本 4 中使用 FPAT,如

gawk 'BEGIN { FPAT="\\<GOOD\\>"; RS="^$" } { print NF }' file

如果要计算给定记录中短语 GOOD DI 的完全匹配数,例如记录号 3,您可以使用

gawk 'NR==3 { print patsplit($0,a,/GOOD DI/) }' file

【讨论】:

  • 它是否适用于我作为对其他答案的评论提供的示例?
  • @user657592 您是否正在寻找包含空格的单词,例如GOOD DI
  • 是的。我想要记录中“GOOD DI”的出现次数。但我想要这样,有空间。
  • @user657592 所以这不是您要查找的单词,而是记录中的完全匹配。像GOOD DI AGOOD DIN 一样都会匹配吗?
  • 为您的耐力(以及一个好的解决方案)+1 :-) 和 @user657592 -- 下次发布一些示例输入数据和预期结果!这将消除猜测,您会更快地得到答案!
【解决方案2】:

您的问题不是很清楚,如果您显示一些输入文件、您目前拥有的整个脚本以及您想要实现的输出,将会有所帮助。

与此同时,由于您的问题中没有任何相反的建议,您可以执行以下操作:

awk 'somescript' somefile | grep --count -w 'GOOD DI' 

【讨论】:

  • 示例GOOD DI is not as happy as GOOD DIN but GOOD DIN is not all that happy. GOOD DI is delusional
【解决方案3】:

您不能对文本字符串应用 grep,这就是您正在做的事情。如果您确实需要使用 grep/system ,则需要以下内容:

system("echo '"$0"' | grep --count -w 'foo'")

但这也不好,因为 count 只计算它出现的行而不是你所追求的行的次数。或者看起来是这样。

如果您使用正则表达式作为拆分分隔符,您会得到拆分出现次数 +1。

因此以下将起作用:

awk '{printf FNR; a=split($0,myarray,/.OOD/); print "  "a-1}' file.txt

这将打印每个行号以及您的正则表达式出现的次数。 (在本例中为“.OOD”。代表 GOOD、FOOD、MOOD 等)

【讨论】:

    【解决方案4】:

    你可以用老式的方式来做

    awk 'BEGIN{count=0} {
      for( i=1;i<=NF; i++)  {
        if( $i == "GOOD" ){
           ++count
        }
      }
    }END {
      print count
    }' file
    

    【讨论】:

      猜你喜欢
      • 2016-07-09
      • 2017-11-15
      • 1970-01-01
      • 1970-01-01
      • 2021-05-15
      • 1970-01-01
      • 1970-01-01
      • 2013-12-11
      • 1970-01-01
      相关资源
      最近更新 更多