Ein Tool für alle Fälle
Awk – Werkzeug und Skriptsprache
Auswertung einer Messwertdatei
Das folgende Beispiel bereitet eine einfache Messwertdatei (Listing 5) mit einer Zeitspalte und fünf Spalten mit Messwerten auf. Alle sechs Spalten enthalten Fließkommazahlen. Bitte setzen Sie in der Shell die Variable LC_ALL=C, bevor Sie dieses Beispiel ausprobieren.
Listing 5
t Messwert1 Messwert2 Messwert3 Messwert4 Messwert5 0.100000 0.194000 0.166000 0.162000 0.155000 0.194200 0.200000 0.440000 0.388000 0.359000 0.392000 0.400000
Im Listing 5 sehen Sie den Kopf der Tabelle und die ersten Zeilen mit Beispieldaten. Den Mittelwert aus diesen Zahlen zu bilden ist mit Awk ziemlich einfach. Der Skript mittelwert.awk (Listing 6) bildet für jede Messdatenzeile die Summe der gemessenen Werte und teilt sie dann durch die Anzahl der Messwerte.
Listing 6
# Mittelwerte der Daten aus
# einer Messdatendatei
NR==1 {next;}
{summe = 0;
for (i=2; i<=NF; i++) {
summe+=$i;
}
mittelwert = summe/(NF-1)
printf("%6s %8.2f\n",$1,mittelwert);
}
In der Praxis sollen oft Minimal- und Maximalwerte ausgegeben werden. Dies lässt sich durch Sortieren der Spalten auf einer Zeile erreichen. Im Listing 7 ist das Skript messdaten1.awk dargestellt, das für jede Zeile das Maximum und Minimum bildet.
Listing 7
# Auswertung einer Messdatendatei
BEGIN { print(" t MIN MAX"); }
NR==1 { next; }
{
t=0; n=NF;
/* Schreibe die Messwerte in ein Datenfeld (Array): */
for (i=2; i<=n; i++) {
y[i-2] = $i;
}
/* Sortiere das Datenfeld: */
for (i = 0; i <= n-2; i++) {
for (j = i; j > 0 && y[j-1] > y[j]; j--) {
t = y[j]; y[j] = y[j-1]; y[j-1] = t;
}
}
/* Ausgabe: t, MIN, MAX */
printf("%6s %8.6f %8.6f ",$1, y[0], y[n-2]);
printf("\n");
}
Zunächst werden die Messwerte ($1 bis $NF) in ein Array geschrieben. Nach der Sortierung enthält der erste Wert das Minimum und der letzte Wert den Maximumwert.
Das Sortieren der Werte funktioniert hier über Ausschneiden und Einfügen (Insertion Sort). Dieser Algorithmus reicht für wenige Messwerte pro Zeile aus. Effizientere Varianten finden Sie zum Beispiel in Jon Bentleys exzellentem Buch [5]. Für komplexere Sortieralgorithmen bietet sich in Awk die Einbindung als Funktion an.
Zusammenfassung
Mit Awk lassen sich viele Aufgaben aus dem Alltag eines Nutzers oder Administrators schnell und effektiv lösen. Es ist einfacher zu erlernen und anzuwenden als viele andere Programmiersprachen. Dieser Artikel hat Sie mit den Grundlagen vertraut gemacht und einige komplexere Beispiele vorgestellt. In den Newsgruppen und auf vielen Webseiten finden Sie Unterstützung und unzählige weitere Beispiele.
Die frei verfügbare Dokumentation [2] erleichtert den Einstieg und beinhaltet auch viele Beispiele. Das Buch der drei Awk-Erfinder Alfred Aho, Peter Weinberger und Brian Kernighan [6] ist für Fortgeschrittene zu empfehlen. Die Beispiele zum Buch sind auch online unter [7] zu finden. (jlu/pkr)
Infos
[1] Beispiele: Stefan Lagotzki, awk-Beispiele, Version 1.0 (Sept. 2005) http://www.lagotzki.de/awk/
[2] GNU-Awk-Handbuch: Arnold Robbins, "The GNU Awk User's Guide", 2003, http://www.gnu.org/software/gawk/manual/gawk.html
[3] Regular Expressions: Martin Möller, "Strukturierte Suche", LinuxUser 08/2005, S. 90 ff.
[4] Jeffrey E. F. Friedl: "Reguläre Ausdrücke", O'Reilly, 2003
[5] Jon Bentley: "Perlen der Programmierkunst", Addison-Wesley, 2000
[6] Aho, Weinberger, Kernighan: "The AWK Programming Language", Addison-Wesley, 1988.
[7] Aho, Weinberger, Kernighan: "Examples from The AWK Programming Language", 2005, http://cm.bell-labs.com/cm/cs/awkbook/



