bash 中多个文件的标准偏差

Standard Deviation from multiple files in bash

我想计算一系列名为“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 }' | paste -sd+ | bc` 
        #Mean 
        mean=`echo "scale=5 ; $sum / $lines" | bc` 
        echo "$mean" 
        echo " "

我想计算每个文件的标准偏差。我知道标准差公式是

S.D=sqrt((1/N)*(sum of (value - mean)^2))

但我不确定如何将它实现到我的脚本中。

awk强大到足以计算一个文件的平均值

$ awk -F, '{sum+=} END{print sum/NR}' file

添加标准差(不是说你的公式是针对人口的,不是针对样本的,这就是我在这里复制的)

 $ awk -F, '{sum+=; ss+=^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+=; ss+=^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.

将按指定的数字顺序展开。