2012-03-07 9 views
5

"awk:fatal:division by zero attemptempted"というエラーが発生しています。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

答えて

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まで標準入力から読み取ります。

は、次の2つのコマンドがあります。次に、2番目のコマンドが実行され、標準入力を読み込もうとしますが、空であることが分かります。したがって、0のレコードが読み込まれます。したがって、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

これに対応する修正はありますか? –

+0

私はこれを何とかすることができますか? awk 'if(NR> 0){s + = $ 3} END {print $ 2 "\ t" s /(NR)} " –

+0

'END'ブロックはトラブルが発生する場所です。あなたの提案は実際には構文的に不正確です。 'if'を省略した場合、それは 'うまくいく'でしょうが、空の入力でゼロで割ります。 –

関連する問題