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.
将按指定的数字顺序展开。
我想计算一系列名为“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.
将按指定的数字顺序展开。