计算省略字段的字符的出现次数

计算省略字段的字符的出现次数

我有一个如下所示的文件:

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

还有一些方法:

  1. 核心工具

    $ cut -d' ' -f 2- file | fold -w1 | grep -c e
    6
    
  2. 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
    
  3. 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

相关内容