Я бы порекомендовал вернуться к началу -хотя, возможно, можно продолжить, вы в любом случае всего лишь шаг или около того от начала.
Ваш цикл выглядит правильно, за исключением использования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
, а затем подсчитывает количество оставшихся символов.
Еще несколько подходов:
основные утилиты
$ 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
Вы могли бы сделать это:
$ perl -lpe '/\S\s/g;$s+=()=/e/g}{print $s' file
6
$ awk '{sum += gsub(/e/,"&") - gsub(/e/,"&",$1)} END{print sum+0}' file
6