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の使用é@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

もちろん、これを処理する方法は、さまざまな方法で、さまざまな量の出力+詳細で処理できます。

おすすめ記事