2009-09-16 17 views
8

Voglio scrivere uno script awk generico che possa prendere come input un file e un numero di campo (in quel file) e darmi il valore medio di quel campo in quel file. Vorrei usare qualcosa di simile:Script awk generico per calcolare la media su qualsiasi campo tramite l'argomento della riga di comando

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

Naturalmente, posso scrivere la sceneggiatura se so quale campo (ad esempio, $ 3) Ho intenzione di media in anticipo. Sarebbe qualcosa di simile:

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

Ma io voglio essere in grado di modificare il campo voglio media attraverso una linea di comando. È possibile? Grazie!

risposta

11

Questo farà ciò che si vuole:

$ 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

Non potrei usare env come nel modo in cui hai descritto. Per ora, ho appena messo la strada giusta per awk. Funziona comunque. Grazie! – Ritesh

+0

Usare/usr/bin/env è il mio modo di far fronte al fatto che diversi sistemi installano awk in posti diversi. Potresti voler inviare un 'env' dal prompt dei comandi per scoprire dove env si trova nel tuo sistema. –

+0

/usr/bin/env: awk -f: Nessun file o directory Questo è il messaggio che sto ottenendo. env è in/usr/bin/env. Sebbene tu abbia risolto il mio problema iniziale, mi piacerebbe sapere come utilizzare env. – Ritesh

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

chiamata come awk -v field=3 -f avg.awk input.file

+2

È possibile utilizzare NR per evitare di avere una variabile conteggio: {tot + = $ f} END {tot di stampa/NR} –

+1

... presumendo che l'OP non voglia effettivamente filtrare le intestazioni o saltare i record. :) –

+0

Grazie, funziona sicuramente! L'altra risposta rende la riga di comando più facile da usare però :) – Ritesh

Problemi correlati