2016-11-25 41 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总是返回相同的非排序列表。 –

相关问题