
計算しようとしています。子音と母音の発生存在する複数のファイル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
もちろん、これを処理する方法は、さまざまな方法で、さまざまな量の出力+詳細で処理できます。
答え2
使用する1つの方法真珠次のように:
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 配列の最初の要素はコレクションの総数を累積します。
- 2番目の要素は、アルファベットから母音を引いた集合である子音の累計を累積します。
- 現在のファイルの終わりにデータがダンプされます。ジャンクションには、アレイが無効になる副作用があります。