2009-09-16 234 views
8

Quiero escribir un script awk genérico que puede tomar como entrada un archivo y un número de campo (en ese archivo) y darme el valor promedio de ese campo en ese archivo. Lo usaría algo como esto:Script awk genérico para calcular el promedio en cualquier campo mediante el argumento de línea de comando

bash$ avg.awk 3 input.file 
22 
bash$ avg.awk 4 input.file 
2001 

Por supuesto, puedo escribir el guión si sé qué campo (por ejemplo, 3 $) Voy a un promedio de antemano. Eso sería algo como esto:

//{tot+=$3; count++} 
END{ 
    print tot/count; 
} 

Pero yo quiero ser capaz de cambiar el campo que quiero hacer un promedio a través de una opción de línea de comandos. ¿Es eso posible? ¡Gracias!

Respuesta

11

Ésta va a hacer lo que quiere:

$ cat avg.awk 
#!/usr/bin/env awk -f 
# Calculate average, syntax: avg.awk field-number file 
BEGIN { field = ARGV[1]; ARGV[1] = "" } 
{ sum += $field } 
END { print sum/NR } 

$ cat data 
1 5 7 
3 6 5 
8 4 6 

$ avg.awk 1 data 
4 

$ avg.awk 2 data 
5 

$ avg.awk 3 data 
6 
+1

No pude usar env como lo describiste. Por ahora, acabo de poner el verdadero camino a awk. Sin embargo, funciona ¡Gracias! – Ritesh

+0

Usar/usr/bin/env es mi manera de lidiar con el hecho de que diferentes sistemas instalan awk en diferentes lugares. Es posible que desee emitir un 'que env' desde el símbolo del sistema para averiguar dónde está env en su sistema. –

+0

/usr/bin/env: awk -f: No existe ningún archivo o directorio Este es el mensaje que recibo. env está en/usr/bin/env. Aunque hayas resuelto mi problema inicial, me encantaría aprender cómo se puede usar env. – Ritesh

5
{ tot += $field; count++ } 
END { print tot/count } 

llamada como awk -v field=3 -f avg.awk input.file

+2

Puede utilizar NR para evitar tener una variable de recuento: {tot + = $ f} END {tot de impresión/NR} –

+1

... suponiendo que OP no quiere filtrar encabezados ni omitir registros. :) –

+0

¡Gracias, definitivamente funciona! La otra respuesta hace que la línea de comandos sea más fácil de usar :) – Ritesh

Cuestiones relacionadas