2012-03-07 13 views
5

kiedy zawsze próbuję obliczyć średnią i odchylenie standardowe za pomocą awk otrzymuję błąd "awk: fatal: division by zero trieded".jak pozbyć się awk śmiertelnego podziału przez zero błędu

moje polecenie jest

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 

czy ktoś wie jak rozwiązać ten problem?

+0

Jaki jest twój plik wejściowy? – kev

Odpowiedz

4

Twój kłopot polega na tym, że ... dzielisz przez zero.

Masz dwie komendy:

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 

Pierwsza komenda czyta ze standardowego wejścia do EOF. Druga komenda jest następnie uruchamiana, próbuje odczytać standardowe wejście, ale stwierdza, że ​​jest pusta, więc ma zerowy odczyt rekordów, więc NR ma wartość zero, a dzielisz przez 0 i ulega awarii.

Musisz zająć się zarówno średnim, jak i standardowym odchyleniem w jednym poleceniu.

awk '{s1 += $3; s2 += $3*$3} 
    END { if (NR > 0){ 
       print $2 "\t" s1/NR; 
       print $2 "\t" sqrt(s2/NR - (s1/NR)^2); 
      } 
     }' 

Pozwala to uniknąć błędów dzielenia przez zero.

+0

Czy jest jakaś poprawka? –

+0

Czy mogę coś takiego zrobić? awk 'if (NR> 0) {s + = 3 $} END {wydrukuj $ 2 "\ t" s/(NR)} ">> średnie; –

+0

Blok "END" to miejsce, w którym wystąpił problem. Twoja propozycja jest w rzeczywistości formalnie zniekształcona; jeśli pominiesz 'if', to będzie" działać ", ale nadal będzie dzielone przez zero z pustymi wejściami. –

Powiązane problemy