2009-09-16 5 views
8

Ich möchte ein generisches awk-Skript schreiben, das eine Datei und eine Feldnummer (in dieser Datei) als Eingabe verwenden und den Durchschnittswert dieses Feldes angeben kann diese Datei. Ich würde es so etwas wie folgt verwenden:Generisches awk-Skript zur Berechnung des Mittelwerts für jedes Feld über das Befehlszeilenargument

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

Natürlich kann ich das Drehbuch schreiben, wenn ich weiß, welches Feld (zum Beispiel $ 3) ich vorher im Durchschnitt werde. Das wäre so etwas wie dieses:

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

Aber ich will in der Lage sein, das Feld I über eine Befehlszeilenoption mitteln ändern möchten. Ist das möglich? Vielen Dank!

Antwort

11

Dieser wird tun, was Sie wollen:

$ 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

Ich könnte nicht env wie die Art, wie Sie beschrieben verwenden. Fürs Erste habe ich gerade den richtigen Weg zu awk gelegt. Es funktioniert aber. Vielen Dank! – Ritesh

+0

Die Verwendung von/usr/bin/env ist meine Art, mit der Tatsache umzugehen, dass verschiedene Systeme awk an verschiedenen Orten installieren. Möglicherweise möchten Sie an der Eingabeaufforderung ein 'which env' ausgeben, um herauszufinden, wo sich env in Ihrem System befindet. –

+0

/usr/bin/env: awk -f: Keine solche Datei oder Verzeichnis Dies ist die Nachricht, die ich bekomme. env ist in/usr/bin/env. Obwohl Sie mein erstes Problem gelöst haben, würde gerne lernen, wie env verwendet werden kann. – Ritesh

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

Aufruf wie awk -v field=3 -f avg.awk input.file

+2

Sie NR eine Zählvariable zu vermeiden, verwenden können: {tot + = $ f} END {print tot/NR} –

+1

... vorausgesetzt, das OP möchte die Header nicht ausfiltern oder Datensätze überspringen. :) –

+0

Danke, es funktioniert definitiv! Die andere Antwort macht die Befehlszeile einfacher zu verwenden :) – Ritesh