我希望從一系列名為“res_NUMBER.cs”的檔案中計算標準偏差,這些檔案格式為 CSV。示例資料包括
1,M,CA,54.9130
1,M,CA,54.9531
1,M,CA,54.8845
1,M,CA,54.7517
1,M,CA,54.8425
1,M,CA,55.2648
1,M,CA,55.0876
我已經計算了平均值
#!/bin/bash
files=`ls res*.cs`
for f in $files; do
echo "$f"
echo " "
#Count number of lines N
lines=`cat $f | wc -l`
#Sum Total
sum=`cat $f | awk -F "," '{print $4}' | paste -sd | bc`
#Mean
mean=`echo "scale=5 ; $sum / $lines" | bc`
echo "$mean"
echo " "
我想計算每個檔案的標準偏差。我知道標準偏差公式是
S.D=sqrt((1/N)*(sum of (value - mean)^2))
但我不確定如何在我的腳本中實作這一點。
uj5u.com熱心網友回復:
awk功能強大,可以輕松計算一個檔案的平均值
$ awk -F, '{sum =$4} END{print sum/NR}' file
添加標準偏差(不是你的公式是針對人口的,而不是針對樣本的,這就是我在這里復制的)
$ awk -F, '{sum =$4; ss =$4^2} END{print m=sum/NR,sqrt(ss/NR-m^2)}' file
54.9567 0.15778
這使用了 stddev = sqrt(Var(x)) = sqrt( E(x^2) - E(x)^2 ) 的事實,它具有更差的數值精度(因為平方值而不是 diff)但是如果你的值有下限。
最簡單的方法是在檔案的 for 回圈中使用它
for f in res*.cs
do
awk -F, '{sum =$4; ss =$4^2}
END {print FILENAME;
print "mean:", m=sum/NR, "stddev:", sqrt(ss/NR-m^2)}' "$f"
end
按此順序運行 res1.cs .. res37.cs,最簡單的方法是更改?? for 回圈
for f in res{1..37}.cs
# the rest of the code not changed.
它將按指定的數字順序展開。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/474235.html
上一篇:遍歷csv并更改滿足條件的列的值
