用于运算符的 awk 正则表达式

用于运算符的 awk 正则表达式

我想使用 awk 正则表达式对文件中的匹配项进行计数和求和。

该文件file包含:

Gra pes
gra ndma
straw berry
blue Berry
banana
peanut
school

我需要为模式匹配创建一个正则表达式,但我不确定如何实现和/或在正则表达式中,尽管它们具有相同的优先级。

我努力了:

awk 'tolower($1) ~ /(gra|straw) (pes|berry)|banana|peanut/ {sum+=1} END {print sum+0}' file

所以它应该是其中之一(gra pes, gra berry, straw pes, straw berry) OR banana, peanut并返回 4,因为有 4 个匹配项。

我假设我的语法出了问题或者香蕉|花生,但我不知道如何解决它。

关于出了什么问题有什么想法吗?谢谢

答案1

你的正则表达式没问题。你的问题是你正在匹配tolower($1)第一个字段(以空格分隔,默认值为FS)转换为小写。

例如,在第一行 ( Gra pes) 上,它将与正则表达式匹配gra并失败。

对于整个记录,您需要$0

awk 'tolower($0) ~ /regexp/ ...'

另请注意,默认情况下,正则表达式并未锚定,因此,它将匹配peanutbutter例如peanut在其中找到的实例。如果您希望输入记录通过正则表达式作为一个整体进行匹配,您需要:

awk 'tolower($0) ~ /^(foo|bar)$/'

哪个匹配主题的开头( ^) 后跟任一foobar后跟主题结束( $)。请注意,括号在这里很重要。^foo|bar$可能是^foo(foo在开始处 ) 或bar$(bar在结束处 ),所以会匹配fooXYbar例如。

答案2

作为替代方案awk,您可以使用grep

grep -Eixc '(gra|straw) (pes|berry)|banana|peanut' file
  • -E使用扩展正则表达式
  • -i不区分大小写的匹配
  • -x仅匹配整行
  • -c计算匹配行数

相关内容