EMZETT.
Login

Kurz: Längere Programme stehen in einer Datei und beginnen mit #!/usr/bin/awk -f:

Teil des Kurses AWK

Kapitel 5 von 8 im Kurs AWK. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

Mehrzeilige Programme und Skripte

Längere Programme stehen in einer Datei und beginnen mit #!/usr/bin/awk -f:

#!/usr/bin/awk -f
# Bericht über Verkäufe
BEGIN {
    FS = ","
    daten = "Nord,100\nSued,250\nNord,50\nWest,75\nSued,25"
    n = split(daten, zeilen, "\n")
    for (i = 1; i <= n; i++) {
        split(zeilen[i], f, ",")
        summe[f[1]] += f[2]
        anzahl[f[1]]++
    }
    PROCINFO["sorted_in"] = "@val_num_desc"
    for (r in summe)
        printf "%-6s Summe %4d  Anzahl %d  Mittel %.1f\n", r, summe[r], anzahl[r], summe[r] / anzahl[r]
}

Ausgabe:

Sued   Summe  275  Anzahl 2  Mittel 137.5
Nord   Summe  150  Anzahl 2  Mittel 75.0
West   Summe   75  Anzahl 1  Mittel 75.0

Eigene Funktionen und Rekursion

function fib(n) { return n < 2 ? n : fib(n - 1) + fib(n - 2) }
 
function sortiere(a, n,    i, j, t) {       # Bubblesort
    for (i = 1; i < n; i++)
        for (j = 1; j <= n - i; j++)
            if (a[j] > a[j + 1]) { t = a[j]; a[j] = a[j + 1]; a[j + 1] = t }
}
 
function binaer(n,    s) {
    if (n == 0) return "0"
    while (n > 0) { s = (n % 2) s; n = int(n / 2) }
    return s
}
 
function istPrim(n,    i) {
    if (n < 2) return 0
    for (i = 2; i * i <= n; i++) if (n % i == 0) return 0
    return 1
}
 
BEGIN {
    print fib(20)
    n = split("5 3 9 1 7", z, " ")
    sortiere(z, n)
    for (i = 1; i <= n; i++) printf "%d ", z[i]
    print ""
    print binaer(10), binaer(255)
    for (i = 1; i <= 30; i++) if (istPrim(i)) printf "%d ", i
    print ""
}

Ausgabe:

6765
1 3 5 7 9
1010 11111111
2 3 5 7 11 13 17 19 23 29

gawk-Erweiterungen

BEGIN {
    # asort, Zeit und Bitoperationen
    n = asort(werte, sortiert)
    a[1] = 30; a[2] = 10; a[3] = 20
    n = asort(a, b)
    for (i = 1; i <= n; i++) printf "%d ", b[i]
    print ""
    print and(12, 10), or(12, 10), xor(12, 10), lshift(1, 4), rshift(256, 4)
    print strftime("%Y", 0, 1)
    print mktime("2000 01 01 00 00 00") > 0
    print systime() > 1000000000
    print length(a)
    x[1][1] = "tief"; x[1][2] = "tiefer"
    print x[1][2], isarray(x[1])
    print typeof(1), typeof("a"), typeof(a)
    print gensub(/(a)(b)/, "\\2\\1", "g", "abab")
    print toupper(substr("wort", 1, 1)) substr("wort", 2)
}

Ausgabe:

10 20 30
8 14 6 16 16
1970
3
tiefer 1
number string array
baba
Wort

Nützliche Einzeiler

printf 'eins zwei\ndrei\n\nvier fuenf sechs\n' > /tmp/awk-text.txt
awk 'END { print NR }' /tmp/awk-text.txt                 # Zeilen zählen
awk '{ n += NF } END { print n }' /tmp/awk-text.txt       # Wörter zählen
awk 'NF' /tmp/awk-text.txt                                # Leerzeilen entfernen
awk '{ print length($0) ": " $0 }' /tmp/awk-text.txt       # Zeilenlängen
awk '{ $1 = $1; print }' OFS=- /tmp/awk-text.txt            # Felder neu verbinden
awk '{ a[NR] = $0 } END { for (i = NR; i >= 1; i--) print a[i] }' /tmp/awk-text.txt   # tac
awk '!gesehen[$0]++' /tmp/awk-text.txt                      # Duplikate entfernen
awk 'length > 8' /tmp/awk-text.txt                          # lange Zeilen
rm /tmp/awk-text.txt

Ausgabe:

4
6
eins zwei
drei
vier fuenf sechs
9: eins zwei
4: drei
0:
16: vier fuenf sechs
eins-zwei
drei
 
vier-fuenf-sechs
vier fuenf sechs
 
drei
eins zwei
eins zwei
drei
 
vier fuenf sechs
eins zwei
vier fuenf sechs

Merke

  • Längere AWK-Programme gehören in .awk-Dateien mit Shebang #!/usr/bin/awk -f
  • PROCINFO["sorted_in"] steuert die Schleifenreihenfolge (gawk)
  • gawk bietet asort, gensub, strftime, Bit-Funktionen und mehrdimensionale Arrays
  • !gesehen[$0]++ ist der bekannte Einzeiler gegen Duplikate

Übungsaufgabe

Schreibe einen Einzeiler, der die größte Zahl der zweiten Spalte findet.

Quiz zur Selbstkontrolle

+?

  • Gibt jede Zeile nur beim ersten Auftreten aus (richtig)
  • Zählt alle Zeilen
  • Sortiert
  • Löscht Leerzeilen

?

  • Steuert die Reihenfolge von for-in (gawk) (richtig)
  • Setzt den Dateinamen
  • Sortiert die Datei
  • Startet Prozesse

Weiter im Kurs

Zurück: Dateien, Spalten und Berichte

Weiter: Reguläre Ausdrücke vertieft

Alle Kapitel: AWK im Überblick