省略されたフィールドの文字発生回数の計算

省略されたフィールドの文字発生回数の計算

次のファイルがあります。

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のゴルフ版)先行は周期が難しい)

    $ 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

関連情報