[Index]

3 Erste Schritte mit awk

In den folgenden Beispielen werden wir mit Hilfe von awk die Ausgabe des Befehls cal formatieren. Wenn Sie sich die Beispieldateien heruntergeladen haben, dann können Sie alle Beispiele einfach nachvollziehen:
 cal -m 4 2001 | gawk -f cal01.awk
Das Ergebnis ist eine einfache Tabelle. Einige Kommentare zum folgenden Quelltext: Jedes awk-Programm kann Anweisungen enthalten, die genau einmal beim Start und am Ende der Ausführung abgearbeitet werden. Diese beiden Blöcke finden Sie im folgenden Quelltext unter BEGIN { ... } und END { ... }. Die Auswirkung der beiden Befehlsblöcke ist oben zu sehen. Der BEGIN-Block schreibt den Tabellenkopf und der END-Block übernimmt die Verabschiedung. Später werden wir BEGIN und END zum Beispiel nutzen, um Kopf und Fuß einer Datei zu erzeugen.

 BEGIN  {
  printf("\n Zeile  Felder           Inhalt");
  printf("\n________________________________________\n\n");
 }

 {
  printf("   %d      %d        %s   \n", NR, NF, $0);
 }

 END {
  printf("\nBye. \n \n");
 }
Der Befehl printf() dient zur formatierten Ausgabe von Daten. Er besitzt im wesentlichen die selben Optionen wie unter C. Detailierte Informationen finden Sie in der Dokumentation zu gawk.
Im folgenden Beispiel wird der Kalender ganz umformatiert. Sie finden hier wieder einige neue Sprachelemente, die im Anschluss erklärt werden.

BEGIN  {
  /* Schreibe die Ueberschriften der Spalten: */
  printf("\n Wochentag \t Datum ");
  printf("\n__________________________\n\n");
}

{  /* Sichere Monat und Jahr in die beiden Variablen year und month    */
   /* (zur spaeteren Verwendung)                                       */
   if (NR==1) {
       year=$2;
       month=$1;
   }

   /* Sichere die Spaltenueberschriften (Tage) in das Feld wd[]        */
   /* diese Schleife tut das selbe wie die                             */
   /* Zuweisungen wd[1]=$1; ... wd[7]=$7; (aber etwas eleganter)       */
   if (NR==2) {
       for (i=1; i<=NF; i++) {
          wd[i]=$i;
       }
   }

   /* Die erste Zeile mit Tagen braucht eine Sonderbehandlung:         */
   /* die Tage muessen ja nicht mit Mo beginnen.                       */
   /* Daher bekommt das jeweilige Datum seine Tagesbezeichnung         */
   /* aus dem Feld wd[i + 7(Tage) - Anzahl der Felder] zugewiesen.     */
   if (NR==3)   {
       for (i=1; i<=NF; i++) {
           printf("\n %s \t \t %2d" ,  wd[i+7-NF], $i);
       }
   }

   /* Die restlichen Zeilen können alle gleich behandelt werden,       */
   /* weil die Tage in der ersten Spalte beginnen.                     */
   if (NR>3 && NF>0) {
       for (i=1; i<=NF; i++) {
            printf("\n %s \t \t %2d " , wd[i], $i);
       }
   }
}

END {
  printf("\n \n %s %s ...  Bye :-) \n \n", month, year);
}
Einige weitere Erklärungen zum zweiten Beispiel:

Bedingte Ausführung von Befehlen

Schleifen

Copyright © 2001 -Stefan Lagotzki-