私の仕事は、ファイル内のランダムな文字の頻度を表示するスクリプトを作成することです。出力には、aからz(大文字と小文字は区別されません)の頻度がパーセントで表示されます。以下のスクリプトを作成しましたが、スクリプトを単純化する方法があるかどうか疑問に思います。
#!/bin/bash
echo Hello, please tell me in which file shall I count the letters:
read file
TOTAL=$( grep -o [[:alpha:]] $file | wc -l )
A=$( grep -io a $file | wc -l )
B=$( grep -io b $file | wc -l )
C=$( grep -io c $file | wc -l )
D=$( grep -io d $file | wc -l )
E=$( grep -io e $file | wc -l )
F=$( grep -io f $file | wc -l )
G=$( grep -io g $file | wc -l )
H=$( grep -io h $file | wc -l )
I=$( grep -io i $file | wc -l )
J=$( grep -io j $file | wc -l )
K=$( grep -io k $file | wc -l )
L=$( grep -io l $file | wc -l )
M=$( grep -io m $file | wc -l )
N=$( grep -io n $file | wc -l )
O=$( grep -io o $file | wc -l )
P=$( grep -io p $file | wc -l )
Q=$( grep -io q $file | wc -l )
R=$( grep -io R $file | wc -l )
S=$( grep -io s $file | wc -l )
T=$( grep -io t $file | wc -l )
U=$( grep -io u $file | wc -l )
V=$( grep -io v $file | wc -l )
W=$( grep -io w $file | wc -l )
X=$( grep -io x $file | wc -l )
Y=$( grep -io y $file | wc -l )
Z=$( grep -io z $file | wc -l )
echo Frequency of 'a': $(($A*100/$TOTAL))%
echo Frequency of 'b': $(($B*100/$TOTAL))%
echo Frequency of 'c': $(($C*100/$TOTAL))%
echo Frequency of 'd': $(($D*100/$TOTAL))%
echo Frequency of 'e': $(($E*100/$TOTAL))%
echo Frequency of 'f': $(($F*100/$TOTAL))%
echo Frequency of 'g': $(($G*100/$TOTAL))%
echo Frequency of 'h': $(($H*100/$TOTAL))%
echo Frequency of 'i': $(($I*100/$TOTAL))%
echo Frequency of 'j': $(($J*100/$TOTAL))%
echo Frequency of 'k': $(($K*100/$TOTAL))%
echo Frequency of 'l': $(($L*100/$TOTAL))%
echo Frequency of 'm': $(($M*100/$TOTAL))%
echo Frequency of 'n': $(($N*100/$TOTAL))%
echo Frequency of 'o': $(($O*100/$TOTAL))%
echo Frequency of 'p': $(($P*100/$TOTAL))%
echo Frequency of 'q': $(($Q*100/$TOTAL))%
echo Frequency of 'r': $(($R*100/$TOTAL))%
echo Frequency of 's': $(($S*100/$TOTAL))%
echo Frequency of 't': $(($T*100/$TOTAL))%
echo Frequency of 'u': $(($U*100/$TOTAL))%
echo Frequency of 'v': $(($V*100/$TOTAL))%
echo Frequency of 'w': $(($W*100/$TOTAL))%
echo Frequency of 'x': $(($X*100/$TOTAL))%
echo Frequency of 'y': $(($Y*100/$TOTAL))%
echo Frequency of 'z': $(($Z*100/$TOTAL))%
上記のスクリプトの最初の部分を置き換える以下のスクリプトのようにforループを使用することを検討しました...しかし、これらの出力をさらに処理する方法があるかどうかわからないため、スタックしましたか?
#!/bin/bash
echo File:
read file
TOTAL=$( grep -o [[:alpha:]] $file | wc -l )
for letter in {a..z}
do echo grep -io $letter $file | wc -l
done
また、小数点以下2桁でスクリプトを出力する方法はありますか?
これは私の最初のスクリプトなので、慈悲深くお願いします:)しかし、改善する方法についてのフィードバックやアドバイスに感謝します。
あなたはほとんどそこにいました!必要な出力と使用するかどうかに応じて、2つのバリアントを使用したソリューションを次に示しますbc
。
#!/bin/bash
echo File:
read file
TOTAL=$( grep -o "[[:alpha:]]" "$file" | wc -l )
for letter in {a..z}
do
count=$(grep -io $letter "$file" | wc -l)
echo "Frequency of $letter : $(bc <<< "scale=2; $count*100/$TOTAL")%" # Variant with floats, requires bc
echo "Frequency of $letter : $(($count*100/$TOTAL))%" # Variant with integers
done
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加