다음과 같은 파일이 있습니다.
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