【问题标题】:how to get rid of awk fatal division by zero error如何通过零错误摆脱 awk 致命除法
【发布时间】:2012-03-07 13:17:14
【问题描述】:

当我尝试使用 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

有人知道怎么解决吗?

【问题讨论】:

    标签: awk


    【解决方案1】:

    你的问题是......你被零除。

    你有两个命令:

    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);
                }
             }'
    

    这样可以避免除零错误。

    【讨论】:

    • 我能做点什么吗? awk 'if (NR>0) {s+=$3} END{print $2"\t"s/(NR)}' >> mean;
    • END 块是出现问题的地方。实际上,您的提案在语法上是错误的;如果您省略了if,它将“工作”,但仍会在输入为空的情况下除以零。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多