如何摆脱零误差的awk致命分裂

时间:2012-03-07 03:57:04

标签: awk

当我试图使用awk计算平均值和标准差时,我得到“awk:fatal:除以零的尝试”错误。

我的命令是

awk '{s+=$3} END{print $2"\t"s/(NR)}'  >> mean;
awk '{sum+=$3;sumsq+=$3*$3} END {print $2"\t"sqrt(sumsq/NR - (sum/NR)^2)}' >>sd

有人知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:7)

你的麻烦就是......你除以零。

您有两个命令:

awk '{s+=$3} END{print $2"\t"s/(NR)}'  >> mean;
awk '{sum+=$3;sumsq+=$3*$3} END {print $2"\t"sqrt(sumsq/NR - (sum/NR)^2)}' >>sd

第一个命令从标准输入读取到EOF。然后运行第二个命令,尝试读取标准输入,但发现它是空的,因此读取的记录为零,因此NR为零,并且您除以0,然后崩溃。

您需要在一个命令中处理均值和标准偏差。

awk '{s1 += $3; s2 += $3*$3}
     END {  if (NR > 0){
                print $2 "\t" s1 / NR;
                print $2 "\t" sqrt(s2 / NR - (s1/NR)^2);
            }
         }'

这可以避免被零除错误。