我想使用 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)$/'
哪个匹配主题的开头( ^
) 后跟任一foo
或bar
后跟主题结束( $
)。请注意,括号在这里很重要。^foo|bar$
可能是^foo
(foo
在开始处 ) 或bar$
(bar
在结束处 ),所以会匹配fooX
或Ybar
例如。
答案2
作为替代方案awk
,您可以使用grep
:
grep -Eixc '(gra|straw) (pes|berry)|banana|peanut' file
-E
使用扩展正则表达式-i
不区分大小写的匹配-x
仅匹配整行-c
计算匹配行数