생략된 필드의 문자 발생 횟수 계산

생략된 필드의 문자 발생 횟수 계산

다음과 같은 파일이 있습니다.

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

관련 정보