使用awk计算平均值和标准偏差

使用awk计算平均值和标准偏差,awk,standard-deviation,Awk,Standard Deviation,我有一个“file.dat”,包含24(行)x16(列)个数据 我已经测试了以下awk脚本,该脚本计算每列的平均值 touch aver-std.dat awk '{ for (i=1; i<=NF; i++) { sum[i]+= $i } } END { for (i=1; i<=NF; i++ ) { printf "%f \n", sum[i]/NR} }' file.dat >> aver-std.dat touch aver-std.dat awk'

我有一个“file.dat”,包含24(行)x16(列)个数据

我已经测试了以下awk脚本,该脚本计算每列的平均值

touch aver-std.dat
awk '{   for (i=1; i<=NF; i++) { sum[i]+= $i } }
END { for (i=1; i<=NF; i++ )  
{ printf "%f \n", sum[i]/NR} }' file.dat >> aver-std.dat
touch aver-std.dat

awk'{for(i=1;i您的脚本应该采用以下形式:

awk '{
    sum = 0
    for (i=1; i<=NF; i++) {
        sum += $i
    }
    avg = sum / NF
    avga[NR] = avg
    sum = 0
    for (i=1; i<=NF; i++) {
        sum += ($i - avg) ^ 2
    }
    stda[NR] = sqrt(sum / NF)
}

END { for (i = 1; i in stda; ++i) { printf "%f %f \n", avga[i], stda[i] } }' file.dat >> aver-std.dat
awk'{
总和=0
对于(i=1;i标准偏差为

stdev = sqrt((1/N)*(sum of (value - mean)^2))
但公式还有另一种形式,它不要求你事先知道平均数,它是:

stdev = sqrt((1/N)*((sum of squares) - (((sum)^2)/N)))
(如果您感兴趣,可以在网上快速搜索标准偏差的“平方和”公式以获得推导结果)

要使用此公式,您需要跟踪值的和和和以及平方和。因此,您的awk脚本将更改为:

    awk '{for(i=1;i<=NF;i++) {sum[i] += $i; sumsq[i] += ($i)^2}} 
          END {for (i=1;i<=NF;i++) {
          printf "%f %f \n", sum[i]/NR, sqrt((sumsq[i]-sum[i]^2/NR)/NR)}
         }' file.dat >> aver-std.dat

awk'{for(i=1;i以下是我对研磨机数据输出文件所做的一些计算,该文件用于一个必须中断的长浸泡试验:

标准偏差(偏差)+平均值:

cat <grinder_data_file> | grep -v "1$" | awk -F ', '  '{   sum=sum+$5 ; sumX2+=(($5)^2)} END { printf "Average: %f. Standard Deviation: %f \n", sum/NR, sqrt(sumX2/(NR) - ((sum/NR)^2) )}'
cat <grinder_data_file>  | grep -v "1$" | awk -F ', '  '{   sum=sum+$5 ; sumX2+=(($5)^2)} END { avg=sum/NR; printf "Average: %f. Standard Deviation: %f \n", avg, sqrt(sumX2/(NR-1) - 2*avg*(sum/(NR-1)) + ((NR*(avg^2))/(NR-1)))}'
cat|grep-v“1$”| awk-F',“{sum=sum+$5;sumX2+=($5)^2)END{printf”平均值:%F。标准偏差:%F\n”,sum/NR,sqrt(sumX2/)-(NR((sum/NR)^2))”
标准偏差(无偏差)+平均值:

cat <grinder_data_file> | grep -v "1$" | awk -F ', '  '{   sum=sum+$5 ; sumX2+=(($5)^2)} END { printf "Average: %f. Standard Deviation: %f \n", sum/NR, sqrt(sumX2/(NR) - ((sum/NR)^2) )}'
cat <grinder_data_file>  | grep -v "1$" | awk -F ', '  '{   sum=sum+$5 ; sumX2+=(($5)^2)} END { avg=sum/NR; printf "Average: %f. Standard Deviation: %f \n", avg, sqrt(sumX2/(NR-1) - 2*avg*(sum/(NR-1)) + ((NR*(avg^2))/(NR-1)))}'
cat|grep-v“1$”| awk-F',“{sum=sum+$5;sumX2+=($5)^2}END{avg=sum/NR;printf“平均值:%F.标准偏差:%F\n”,平均值,sqrt(sumX2/(NR-1)-2*平均值*(sum/(NR-1))+((NR*(avg^2))/(NR-1)))

要简单地计算数字列表的总体标准偏差,可以使用如下命令:

awk'{x+=$0;y+=$0^2}END{print sqrt(y/NR-(x/NR)^2)}
或者计算样本标准偏差:

awk'{sum+=$0;a[NR]=$0}END{for(i in a)y+=(a[i]-(sum/NR))^2;打印sqrt(y/(NR-1))}'

^
在POSIX中。
***
gawk
nawk
支持,但不是由
mawk

支持。我只需补充一点,它是准标准偏差,必须除以(NR-1)。问候并感谢。@PLM,要不要解释一下您最后的评论?在
末尾
块中,
NR
有总行数,这是正确的解决方案。@shiri这是样本标准偏差和总体标准偏差之间的差异。请参阅此处了解详细信息:还有另一种计算标准偏差的方法考虑到浮点运算可能导致取消的选项。请查阅B.P.Welford(1962)…Technometrics 4(3):419–4200感谢@nisetama;我使用了此选项。为完整性起见,可以使用一行线
awk'{x+=$0}END{print x/NR}类似地计算平均值“
对于所问的问题,这是不正确的,因为它计算每一行的std dev,而不是OP请求的每一列。