我有一个如下所示的文件:
hello even evening
how are they?
...
我想计算字母 e 的出现次数,但不考虑第一个字段的字母 e。我使用过这个命令,但它不起作用。
awk 'for(i=2;i<=NR;i++) match($i,/e/){sum++}END{print sum}'
答案1
具有灵活的gsub
特点:
awk '{ $1=""; cnt += gsub("e", "") }END{ print cnt }' file
该
gsub()
函数返回进行替换的次数
答案2
NR
除了使用(当前记录/行的数量)代替(当前记录/行中的字段数量)之外,您的循环看起来是正确的NF
,但使用以下方式进行计数会更容易gsub()
:
$ awk '{ for (i=2; i<=NF; ++i) sum+=gsub("e","e",$i) } END { print sum }' file
6
该gsub()
函数返回进行替换的次数。
在 Perl 中,您可以tr
以类似的方式使用运算符
$ perl -ane 'shift @F; map($sum += tr/e/e/, @F); END { print $sum, "\n" }' file
6
或者,您可以只使用工具箱中的其他基本实用程序:
$ cut -d ' ' -f 2- file | tr -dc 'e' | wc -m
6
这会切断第一个空格字符之前的所有内容,删除不是 的所有内容e
,然后计算剩下的字符数。
答案3
还有一些方法:
核心工具
$ cut -d' ' -f 2- file | fold -w1 | grep -c e 6
Perl(基本上是一个高尔夫版本善行难陀给予)
$ perl -lane 'map{$k+=tr/e//}@F[1..$#F];}{print $k ' file perl -lane 'map{$k+=s/e/e/g}@F[1..$#F]}{print $k' file 6
GNU grep + awk(只是为了好玩)
$ grep -oP '^\S+\K.*' file | awk -F'e' '{k+=NF-1}END{print k}' 6
答案4
$ awk '{sum += gsub(/e/,"&") - gsub(/e/,"&",$1)} END{print sum+0}' file
6