![awk를 사용하여 각 파일의 자음 및 모음 발생 횟수를 인쇄하는 방법은 무엇입니까?](https://linux55.com/image/13758/awk%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EA%B0%81%20%ED%8C%8C%EC%9D%BC%EC%9D%98%20%EC%9E%90%EC%9D%8C%20%EB%B0%8F%20%EB%AA%A8%EC%9D%8C%20%EB%B0%9C%EC%83%9D%20%ED%9A%9F%EC%88%98%EB%A5%BC%20%EC%9D%B8%EC%87%84%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
계산하려고 해요자음과 모음의 발생존재하다여러 파일Linux에서는 각 파일의 발생 횟수를 개별적으로 계산하고 싶습니다. 나는 사용한다
awk -v FS=""'{for ( i=1;i<=NF;i++){if($i ~/[bcdfghjklmnpqrtsvwxyzBCDEFGHJKLMNPQRTSVWXYZ]/)cout_c++ ;else if ($i ~/[aeiouAEIOU]/) count_v++}}END {print FILENAME,count_v,count_c}'
file1은 다음과 같습니다.
bac Dfeg
k87 eH
tRe
rt up
file2는 다음과 같습니다.
hi
rt2w
PrOt
그러나 두 파일 모두의 항목을 인쇄합니다.
file2 7 19
출력이 다음과 같이 되도록 어떻게 변경할 수 있습니까?
file1 5 12
file2 2 7
답변1
이 질문에 대답하려면후속 질문, 이 내 꺼야후속 답변GNU awk 사용(이제 언급된 바와 À
같이 aeiou가 아닌 모든 문자 대신 b, c, d 등을 비모음으로만 계산하도록 수정됨)é
@StéphaneChazelas댓글에서):
$ awk -v IGNORECASE=1 '
{
v_cnt += gsub(/[aeiou]/,"")
c_cnt += gsub(/[bcdfghjklmnpqrtsvwxyz]/,"")
}
ENDFILE {
print FILENAME, v_cnt+0, c_cnt+0
v_cnt = c_cnt = 0
}
' file1 file2
file1 5 12
file2 2 7
이전 답변에서 POSIX awk를 수정하는 방법에 대한 간단한 연습으로 남겨두겠습니다.
위의 대괄호 표현식에 알파벳 문자가 나열되지 않은 경우에도 표시하려면 다음과 같이 조정하면 됩니다.
awk -v IGNORECASE=1 '
{
v_cnt += gsub(/[aeiou]/,"")
c_cnt += gsub(/[bcdfghjklmnpqrtsvwxyz]/,"")
}
/[[:alpha:]]/ {
gsub(/[^[:alpha:]]+/,"")
printf "Warning %s[%d]: Unexpected chars found: %s\n", FILENAME, FNR, $0 > "/dev/stderr"
}
ENDFILE {
print FILENAME, v_cnt+0, c_cnt+0
v_cnt = c_cnt = 0
}
' file1 file2
물론 이를 처리하는 방법은 다양한 방식으로, 다양한 양의 출력 + 세부 사항으로 처리될 수 있습니다.
답변2
사용하는 한 가지 방법진주다음과 같이:
perl -lne '$,=" ";
$A[0] += +lc =~ tr/aeiou//;
$A[1] += s/(?![aeiou])[[:alpha:]]//gi;
print $ARGV, splice @A if eof;
' file1 file2
산출:
file1 5 12
file2 2 7
논평;
- @A 배열의 첫 번째 요소는 총 모음 수를 누적합니다.
- 두 번째 요소는 알파벳에서 모음을 뺀 집합인 자음의 누계를 누적합니다.
- 현재 파일의 끝에서 데이터가 덤프됩니다. 접합에는 배열이 무효화되는 부작용이 있습니다.