[Index]

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");
}