
계산하려고 해요자음과 모음의 발생존재하다여러 파일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 배열의 첫 번째 요소는 총 모음 수를 누적합니다.
- 두 번째 요소는 알파벳에서 모음을 뺀 집합인 자음의 누계를 누적합니다.
- 현재 파일의 끝에서 데이터가 덤프됩니다. 접합에는 배열이 무효화되는 부작용이 있습니다.