2012-03-07 100 views
5

当我试图计算平均值和标准偏差使用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 

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

+0

你的输入文件是什么? – kev 2012-03-07 04:40:35

回答

4

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

你有两个命令:

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

这避免了被零除错误。

+0

有没有解决这个问题? – 2012-03-07 05:04:58

+0

我能做些什么来解释这个吗? awk'if if(NR> 0){s + = $ 3} END {print $ 2“\ t”s /(NR)}'>> mean; – 2012-03-07 05:11:20

+0

'END'块是发生问题的地方。事实上,你的建议在语法上是畸形的;如果你省略了“if”,它会“有效”,但仍然会被空输入除以零。 – 2012-03-07 05:14:01