2012-03-07 40 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