2016-11-25 43 views
2

我的任務是創建一個腳本,顯示文件中隨機字符的頻率。輸出應以百分比顯示a到z的頻率(不區分大小寫)。 我在下面創建了這個腳本,我只是想知道是否有辦法讓它更簡單?有人可以看看我的bash腳本和建議如何使它更簡單嗎?


#!/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))% 

我認爲使用循環如下腳本取代上面的腳本的第一部分......但後來,我被卡住,因爲我不知道是否有任何的工作方式這些產出進一步?


#!/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

嘗試在http://codereview.stackexchange.com/ – Inian

+0

謝謝你的小費! – EvelinaCZ

回答

1

你幾乎在那裏!這是一個包含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 
+1

前段時間有人建議我用[shellcheck](http://www.shellcheck.net/)來檢查我的shell腳本。我想通過這個建議給你。 – Leon

+0

非常感謝!該頁面看起來非常有用! – EvelinaCZ

+0

Thanks @Leon,我不知道shellcheck。 'printf'可以,但我需要一個浮點數。 –

0

您可以使用awk命令你的bash腳本里面

awk -vFS="" 'BEGIN{OFMT="%.2f"} {for(i=1;i<=NF;i++){ if($i~/[a-zA-Z]/) { w[tolower($i)]++} sum++} }END{for(i in w) print i,(100*w[i]/sum),"%"}' 
+0

有趣。爲什麼這些字母沒有排序?當我啓動腳本時,順序是'u,h,v,i,w,x,...'。 –

+0

@EricDuminil它們沒有被排序,因爲它沒有被問到,但是當然你可以添加'| sort'。 – Adam

+0

對不起。我不是在問爲什麼你沒有對結果進行排序。我只是想知道爲什麼awk總是返回相同的非排序列表。 –

相關問題