2012-03-07 20 views
5

cuando intento calcular la media y la desviación estándar usando awk recibo el mensaje "awk: fatal: división por cero intento".cómo deshacerse de la awk división fatal por error cero

mi mando es

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 

¿Alguien sabe cómo resolver esto?

+0

¿Cuál es su archivo de entrada? – kev

Respuesta

4

Tu problema es que ... estás dividiendo por cero.

usted tiene dos comandos:

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 

El primer comando lee de la entrada estándar a EOF. El segundo comando se ejecuta, intenta leer la entrada estándar, pero encuentra que está vacío, por lo que tiene cero registros leídos, por lo que NR es cero, y se divide entre 0 y se bloquea.

Tendrá que lidiar con la desviación media y la estándar en un solo comando.

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

Esto evita los errores de división por cero.

+0

¿Hay alguna solución para esto? –

+0

¿Puedo hacer algo así? awk 'if (NR> 0) {s + = $ 3} END {print $ 2 "\ t" s/(NR)}' >> mean; –

+0

El bloque 'END' es donde ocurre el problema. Su propuesta está sintácticamente mal formada, de hecho; si omite el 'si', 'funcionaría', pero aún se dividiría entre cero con la entrada vacía. –

Cuestiones relacionadas