Script awk generico per calcolare la media su qualsiasi campo tramite l'argomento della riga di comando

StackOverflow https://stackoverflow.com/questions/1434016

Domanda

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. Lo userei in questo modo:

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

Ovviamente, posso scrivere la sceneggiatura se so quale campo (ad esempio, $ 3) andrò in media in anticipo. Sarebbe qualcosa del genere:

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

Ma voglio essere in grado di cambiare il campo che voglio mediare attraverso un'opzione della riga di comando. È possibile? Grazie!

È stato utile?

Soluzione

Questo farà quello che vuoi:

$ 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

Altri suggerimenti

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

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top