次のファイルがあります。
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のゴルフ版)先行は周期が難しい)
$ 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