awk
Nützliche Einzeiler - Durchschnittsberechnung aus einem CSV usw
Suche…
Stabile Verarbeitung tabellarischer Daten (CSV et al.)
Die Verarbeitung tabellarischer Daten mit awk ist sehr einfach, vorausgesetzt, die Eingabe ist korrekt formatiert. Die meisten Softwareprodukte, die Tabellendaten erzeugen, verwenden bestimmte Funktionen dieser Formatfamilie, und awk- Programme, die Tabellendaten verarbeiten, sind oft spezifisch für Daten, die von einer bestimmten Software erzeugt werden. Wenn eine allgemeinere oder robustere Lösung erforderlich ist, bieten die meisten gängigen Sprachen Bibliotheken, die eine Vielzahl von Funktionen in Tabellendaten enthalten:
- optionale Spaltennamen in der ersten Zeile
- Mischung aus zitierten und nicht zitierten Spaltenwerten
- verschiedene Trennzeichen
- lokalisierte Formate für Floating-Nummern
Obwohl es auf jeden Fall möglich ist, all diese Funktionen sauber und generisch mit awk zu handhaben, lohnt sich dies wahrscheinlich nicht.
Austausch von zwei Spalten in Tabellendaten
Gegeben eine Datei mit ; als Spaltenbegrenzer. Das Permutieren der ersten und der zweiten Spalte erfolgt durch
awk -F';' -v 'OFS=;' '{ swap = $2; $2 = $1; $1 = swap; print }'
Berechnen Sie den Durchschnitt der Werte in einer Spalte aus Tabellendaten
Gegeben eine Datei mit ; als Spaltenbegrenzer. Wir berechnen den Mittelwert der Werte in der zweiten Spalte mit dem folgenden Programm. Die eingegebene Eingabe ist die Liste der Noten einer Schülergruppe:
awk -F';' '{ sum += $2 } END { print(sum / NR) }' <<EOF
Alice;2
Victor;1
Barbara;1
Casper;4
Deborah;0
Ernest;1
Fabiola;4
Giuseppe;4
EOF
Die Ausgabe dieses Programms ist 2.125 .
Denken Sie daran, dass NR die Nummer der gerade verarbeiteten Zeile enthält, also im END Block die Gesamtzahl der Zeilen in der Datei.
Denken Sie daran, dass der Median in vielen Anwendungen (Überwachung, Statistik) eine viel nützlichere Information ist. Siehe das entsprechende Beispiel.
Auswahl bestimmter Spalten in Tabellendaten
Wir gehen davon aus, dass eine Datei verwendet wird. als Spaltenbegrenzer. Wenn Sie einen bestimmten Satz von Spalten auswählen, ist nur eine Druckanweisung erforderlich. Das folgende Programm wählt beispielsweise die Spalten 3, 4 und 7 aus seiner Eingabe aus:
awk -F';' -v 'OFS=;' '{ print $3, $4, $7 }'
Es ist wie üblich möglich, die zu druckenden Zeilen sorgfältiger auszuwählen. Das folgende Programm wählt die Spalten 3, 4 und 7 aus seiner Eingabe aus, wenn das erste Feld Alice oder Bob :
awk -F';' -v 'OFS=;' '($1 == "Alice") || ($1 == "Bob") { print $3, $4, $7 }'
Berechnen Sie den Median der Werte in einer Spalte aus Tabellendaten
Gegeben eine Datei mit ; als Spaltenbegrenzer. Wir berechnen den Median der Werte in der zweiten Spalte mit dem folgenden Programm, geschrieben für GNU awk . Die bereitgestellte Eingabe ist die Liste der Noten einer Schülergruppe:
gawk -F';' '{ sample[NR] = $2 }
END {
asort(sample);
if(NR % 2 == 1) {
print(sample[int(NR/2) + 1])
} else {
print(sample[NR/2])
}
}' <<EOF
Alice;2
Victor;1
Barbara;1
Casper;4
Deborah;0
Ernest;1
Fabiola;4
Giuseppe;4
EOF
Die Ausgabe dieses Programms ist 1 .
Denken Sie daran, dass NR die Nummer der gerade verarbeiteten Zeile enthält, also im END Block die Gesamtzahl der Zeilen in der Datei.
Viele Implementierungen von awk haben keine Funktion zum Sortieren von Arrays, die daher definiert werden müssen, bevor der obige Code verwendet werden kann.
Auswählen eines Liniensatzes zwischen zwei Mustern
Der Musterabgleich kann effektiv mit awk da er die folgenden Aktionen steuert, dh { pattern } { action } . Eine coole Verwendung des Musterabgleichs besteht darin, ein Vielfaches zwischen zwei Mustern in einer Datei, patternA Muster patternA und Muster patternA patternB
$ awk '/patternA/,/patternB/' file
Angenommen, mein Dateiinhalt lautet wie folgt, und ich möchte die Zeilen nur zwischen dem obigen Muster extrahieren: -
$ cat file
This is line - 1
This is line - 2
patternA
This is line - 3
This is line - 4
This is line - 5
patternB
This is line - 6
$ awk '/patternA/,/patternB/' file
patternA
This is line - 3
This is line - 4
This is line - 5
patternB
Der obige Befehl führt keine bestimmte { action } außer um die Zeilen passend auszudrucken, aber bestimmte Aktionen innerhalb der Zeilenuntergruppe können mit einem Aktionsblock ( {} ) angewendet werden.