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

new*_*bie 6 awk

当我试图使用awk计算平均值和标准差时,我得到"awk:致命:除零尝试"错误.

我的命令是

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
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*ler 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
Run Code Online (Sandbox Code Playgroud)

第一个命令从标准输入读取到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);
            }
         }'
Run Code Online (Sandbox Code Playgroud)

这避免了被零除错误.