[Index]

4 Datenformatierung mit awk

In diesem Kapitel wird der Kalender nun als HTML-Tabelle formatiert. Der formatierte Kalender wird dabei in verschiedenen Versionen erstellt. Der Aufruf
 cal -m 4 2001 | gawk -f cal_html.awk
ergibt bereits eine einfache HTML-Seite mit einem Kalender vom April 2001. Im folgenden wird das Programm abschnittsweise erklärt.

BEGIN  {
   printf("\n<HTML>");
   printf("\n<HEAD>");
   printf("\n<link rel=\"stylesheet\" href=\"av.css\" type=\"text/css\">");
   printf("\n</HEAD>");
   printf("\n<BODY>");
}
Am Beginn werden die HTML-Befehle für den Header, für das Einbinden des Stylesheets und für den Beginn des Body auf die Standardausgabe geschrieben. In der Praxis sind noch einige weitere Angaben notwendig (das Beispiel soll aber nicht unübersichtlich werden). Zu beachten ist: wenn ein " ausgegeben werden soll, muss das durch die Zeichenkombination \" geschehen.
{
   if (NR==1) {
    year=$2;
    month=$1;
    printf("\n <h2> %s  %s  </h2>  \n \n", month, year);
   }

   if (NR==2) {
       printf("\n <table border=\"1\" cellpadding=\"5\" cellspacing=\"5\" bgcolor=\"#DDDDDD\"> ");
       printf("\n <tr> ");

       for (i=1; i<=NF; i++) {
           printf(" \n   <th align=\"center\"  width=\"12%\">%s     </th>",  $i);
       }
       printf("\n </tr>");
   }
   /* dieser Block wird fortgesetzt */
Wenn die erste Zeile (NR==1) bearbeitet wird, werden Monatsname und Jahr in die beiden Variablen gespeichert und dann als Überschrift formatiert. In der zweiten Zeile (NR==2) wird zuerst eine Tabelle begonnen. Dann schreibt das awk-Script die Titel der einzelnen Tage als Tabellenkopf (<th>) in die HTML-Datei.

   if (NR==3)  {
       printf("\n <tr> ");
       for (i=1; i<=(7-NF); i++) {
           printf(" \n   <td>   </td> ");
       }
       for (i=1; i<=NF; i++) {
           printf(" \n   <td align=\"center\">  %s </td>",$i);
       }
       printf("\n </tr>")
   }

   if (NR>3 && NF>0) {
       printf("\n <tr>");
       for (i=1; i<=NF; i++) {
           printf(" \n   <td align=\"center\">  %s </td>",$i);
       }
       for (i=NF+1; i<=7; i++) {
           printf(" \n   <td>   </td> ");
       }
       printf("\n </tr>")
   }
}
Im folgenden Codefragment werden die Abkürzungen der Wochentage durch die vollständigen Namen ersetzt. Am Beispiel des Montag: entweder Mo oder Mon wird durch Montag ersetzt.

       /* Beispiel 1 fuer eine Ersetzung von Ausdruecken: deutsche Wochentage. */
       gsub(/So|Son/, "Sonntag");
       gsub(/Mo|Mon/, "Montag");
       gsub(/Di|Die/, "Dienstag");
       gsub(/Mi|Mit/, "Mittwoch");
       gsub(/Do|Don/, "Donnerstag");
       gsub(/Fr|Fre/, "Freitag");
       gsub(/Sa|Sam/, "Samstag");

Zum Schluss noch ein einfaches Shell-Script, das dieses Programm auf 12 Monate eines Jahres anwendet:


#!/bin/bash
monat=1
while [ $monat -lt 13 ]; do
    cal -m $monat 2001 | gawk  -f cal-ger.awk > cal$monat.html
    let monat=monat+1
done;



Copyright © 2001 -Stefan Lagotzki-