2011-12-08 11 views
7

estoy calculando la media de un montón de números en un montón de archivos de texto así:awk calcular la media o cero

grep '^num' file.$i | awk '{ sum += $2 } END { print sum/NR }' 

Pero algunas veces el archivo no contiene el patrón, en la que me cas quiero que el script devuelva cero. ¿Alguna idea de este line-out ligeramente modificado?

Respuesta

14

Está agregando a su carga (promedio) al generar un proceso adicional para hacer todo lo que puede hacer primero. Usar 'grep' y 'awk' juntos es una bandera roja. Sería mejor que escribieras:

awk '/^num/ {n++;sum+=$2} END {print n?sum/n:0}' file 
5

Prueba esto: operador ternario

... END { print NR ? sum/NR : 0 } 
1

uso de awk, es decir m ? m : n lo que significa que, si m tiene un valor, lo utilizan, de lo contrario '?' ':' Usar este otro valor. Tanto n como m pueden ser cadenas, números o expresiones que producen un valor.

grep '^num' file.$i | awk '{ sum += $2 } END { print sum ? sum/NR : 0.0 }' 
+0

Otras respuestas ya señalan el inútil 'grep', pero tal vez quieras arreglar eso todavía. – tripleee

Cuestiones relacionadas