Подсчет вхождений символов без поля

Я бы порекомендовал вернуться к началу -хотя, возможно, можно продолжить, вы в любом случае всего лишь шаг или около того от начала.

1
03.01.2020, 11:02
4 ответа

Ваш цикл выглядит правильно, за исключением использования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
27.01.2020, 23:11

Еще несколько подходов:

  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
    
1
27.01.2020, 23:11

Вы могли бы сделать это:

$ perl -lpe '/\S\s/g;$s+=()=/e/g}{print $s' file
6
1
27.01.2020, 23:11
$ awk '{sum += gsub(/e/,"&") - gsub(/e/,"&",$1)} END{print sum+0}' file
6
1
27.01.2020, 23:11

Теги

Похожие вопросы