awk를 사용하여 각 파일의 자음 및 모음 발생 횟수를 인쇄하는 방법은 무엇입니까?

awk를 사용하여 각 파일의 자음 및 모음 발생 횟수를 인쇄하는 방법은 무엇입니까?

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

관련 정보