5 Eine Sortieraufgabe mit awk
In Kapitel 5 wird eine kleine Aufgabe zum Sortieren von Daten gelöst. Gegeben ist eine ASCII-Datei mit
sechs Zahlenspalten: eine Spalte für die Abszissen und 5 Spalten für Meß- oder Berechnungswerte.
Die Daten stehen auch
als Diagramm zur Verfügung.
Die Datei
umfasst 330 Zeilen und sieht etwa so aus:
0.100000 0.194000 0.166000 0.162000 0.155000 0.194200
0.200000 0.440000 0.388000 0.359000 0.392000 0.400000
0.300000 0.681000 0.678000 0.663000 0.675000 0.677000
0.400000 1.022000 0.992000 0.923000 1.029000 0.941000
:
:
Das folgende Programm fügt den vorhandenen Spalten eine MAX- und eine MIN-Spalte hinzu.
Die Ergebnisdatei hat folgende Form:
0.100000 0.194000 0.166000 0.162000 0.155000 0.194200 0.155000 0.194200
0.200000 0.440000 0.388000 0.359000 0.392000 0.400000 0.359000 0.440000
0.300000 0.681000 0.678000 0.663000 0.675000 0.677000 0.663000 0.681000
0.400000 1.022000 0.992000 0.923000 1.029000 0.941000 0.923000 1.029000
:
:
An diesem Beispiel soll gezeigt werden, wie man mit awk einen einfachen Algorithmus umsetzen
kann.
{
n=NF;
t=0;
/* der erste Wert ist die Abszisse. Also werden nur die anderen Werte */
/* zum Sortieren in das Array geschrieben. */
for (i = 2; i <= n; i++) {
y[i-2] = $i;
}
/* auf das Array y wird der Algorithmus insertion sort angewendet */
for (i = 0; i < n-1; i++) {
for (j = i; j > 0 && y[j-1] > y[j]; j--) {
t = y[j];
y[j] = y[j-1];
y[j-1] = t;
}
}
/* schreibe die Ausgangswerte (inkl. Abszissen) in die Ausgabedatei */
for (i = 1; i < NF; i++) {
printf("%10.6f",$i);
}
/* schreibe die Maximum und Minimum - Werte in die Ausgabedatei */
printf(" %10.6f %10.6f ", y[1], y[n-2]);
printf("\n");
}