[ awk-Tutorium ]

 

Kapitel 3

Ein- und Ausgabeformate

 

3.1    Formatierte Ausgabe

Bisher kennen wir nur die Ausgabe mit print. Dies ist die einfachste Form, in der alle Argumente, die durch Kommas getrennt werden, nacheinander durch Leerzeichen getrennt ausgegeben werden.

Eine typische Ausgabe für das Beispiel oben, print x, n, x/n, wäre:

    1524 108 14.1111

Jeder print-Befehl schreibt eine neue Zeile.

Gerade für Datensätze, die meist einem strengen Format unterliegen, möchte man aber eine bessere Formatierung der Ausgabe. Dazu gibt es den printf-Befehl (print formatted):

    printf "[format]", [argumente]

Es kann eine beliebige Anzahl von Argumenten übergeben werden. Für jedes übergebene Argument muss im [format]-String ein Ausgabeformat, das mit dem Prozentzeichen % beginnt, angegeben werden.

Die wichtigsten Formate sind:

    %s      String
    %d      ganze Zahl (decimal)
    %f      Fließkommazahl (float)
    %e      Fließkommazahl immer in Exponentenschreibweise
    %g      wie %e für Zahlen ab 1e06, %f sonst
    %c      Einzelnes ASCII-Zeichen (character)
    %x      ganze Zahl als Hexadezimalzahl

Buchstaben in Zahlen bei %e, %g und %x werden klein ausgegeben. Für Großbuchstaben gibt es die Notationen %E, %G und %X.

Zwischen dem Prozentzeichen und dem Ausgabetyp können Angaben zur Breite des Ausgabefeldes gemacht werden. %8d passt eine ganze Zahl rechtsbündig in ein Feld von 8 Zeichen ein. Geht der Breite ein Minus voran, so erfolgt die Ausgabe ins Feld linksbündig: %-8d. Wird ein Plus vorangestellt, so wird auf jeden Fall ein Vorzeichen ausgegeben, auch wenn die Zahl positiv ist.

Für Fließkommazahlen kann nach einem Dezimalpunkt die Anzahl der signifikanten Nachkommastellen angegeben werden: %16.4f schreibt die Zahl mit vier Nachkommastellen in ein Feld von 16 Zeichen Breite.

Beginnt die Breitenangabe mit einer Null, so werden die unbenutzten Felder links nicht mit Leerzeichen, sondern mit Nullen aufgefüllt:

    printf "Uhrzeit: %02d:%02d", hrs, min;

Alles im Formatstring, was nicht zu einer Formatangabe mit % gehört, wird wortwörtlich ausgegeben. Nach printf beginnt nicht automatisch eine neue Zeile wie bei print. Eine neue Zeile wird mit dem Sonderzeichen \n eingeleitet:

    printf "ersteZeile\nzweiteZeile\ndritteZeile\n"

Es gibt mehrere solche Sonderzeichen, die mit einem Backslash beginnen:

    \n      Zeilenumbruch (newline)
    \f      Seitenumbruch (form feed)
    \t      Tabulator
    \b      Backspace
    \a      Piepston (alert)
    \\      Backslash
    \"      Anführungsstriche
    \'      Hochkommas
    \0      Das Nullzeichen am Ende des Strings

   Strings können in awk beliebig lang sein. Sie hören mit dem Zeichen \0, das dem ASCII-Code 0 entspricht, auf (nullterminierte Strings).

 

3.2    Formatgebundens Einlesen mit Substrings

Substrings sind Teile von Strings. In awk bezeichnet

    substr ([string], [anfang], [länge])

den Substring von [String] ab der Stelle [anfang] der Länge [länge]. Das erste Zeichen des Strings hat dabei die Position 1. substr ("Schande",3,4) ist also »hand«. Wenn [länge] weggelassen wird, geht der Substring bis zum Ende des Strings.

Betachten wir also eine Eingabekarte nach dem typischen Achter-Format, etwa eine Karte mit Knotenkoordinaten:

    $......|....id.|.....x.|.....y.|.....z.|
    NODE          12 12.0000 33.6773-992.762

Um nun den Durchschnitt aller Knotenkoordinaten zu bilden, lautet das Skript:

    substr($0,1,4)=="NODE" {
        x += substr($0,17,8);
        y += substr($0,25,8);
        z += substr($0,33,8);
        n++;
    }

    END {
        printf "NODE    AVERAGE %8.2f%8.2f%8.2f",
            x/n ,y/n ,z/n;
    }

   Da dieses Skript schon sehr lang ist, schreibt man es besser in eine eigene Datei. Dann kann man die Anweisungen zeilenweise angeben, das sieht übersichtlicher aus.

 

3.3    Weitere Stringoperationen

Es gibt noch weitere nützliche Stringoperationen, die hier kurz vorgestellt werden:

sub([alt], [neu], [string])
(substitute) ersetzt das erste Vorkommen von [alt] im String [string] durch [neu]. [alt] kann dabei ein regulärer Ausdruck in Schrägstrichen sein. Wird [string] nicht angegeben, so wird in $0 ersetzt.

gsub([alt], [neu], [string])
(globally substitute) ist wie sub, ersetzt aber alle Vorkommnisse von [alt] im String [string] durch [neu].

length([string])
gibt die Länge eines Strings an oder der ganzen Zeile, wenn kein String angegeben wurde.

tolower([string])
wandelt alle Großbuchstaben in [string] in kleine um.

toupper([string])
wandelt alle Kleinbuchstaben in [string] in große um. Umlaute und andere Zeichen mit Akzente werden bei tolower und toupper nicht berücksichtigt.

index([string], [suchstring])
ist die Position in [string], an der [suchstring] zum ersten Mal auftritt, oder Null, wenn der String überhaupt nicht auftritt. index("Mississippi","si") ist 4.

match([string], [suchstring])
ist wie index, nur dass reguläre Ausdrücke angegeben werden können: match ("Mississippi", /[si]/) ist 2.

Aufgaben:

Aufgabe 3a
Schreibe ein Skript, das die Felder einer Zeile formatiert in Achterfelder herausschreibt. Das erste Feld ist ein String, das zweite ein Integer und die drei nächsten sollen Fließkommazahlen sein.

Aufgabe 3b
Schreibe ein Skript, das den umgekehrten Weg geht: Ein formatierter Input (acht Zeichen String, acht Integer und drei mal acht Zeichen Fließkomma) soll unformatiert, d.h. nur durch Leerzeichen getrennt herausgeschrieben werden.

Aufgabe 3c
Schreibe ein Skript, das alle Zeilen, die mit einer Ziffer beginnen, in Großbuchstaben umwandelt. Dabei sollen die deutschen Umlaute berücksichtigt werden, »ß« soll in »ss« umgewandelt werden.


Nächstes Kapitel
Voriges Kapitel
nach oben
Inhalt


________
Startseite --> Dies & das --> awk-Tutorium --> Kapitel 3
Übersicht
Martin Oehm

[ www.martin-oehm.de - Startseite ]
[ Dies & das ]
[ awk-Tutorium ]

Inhalt

Vorwort

1. Kapitel
2. Kapitel
3. Kapitel
4. Kapitel
5. Kapitel

Kurzübersicht
Lösungen