Kurz: Längere Programme stehen in einer Datei und beginnen mit #!/usr/bin/awk -f:
Teil des Kurses AWK
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.0Eigene 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 29gawk-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
WortNü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.txtAusgabe:
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 sechsMerke
- 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
Welche Zeile steht oft am Programmanfang?
- #!/usr/bin/awk -f (richtig)
- #include
- import awk
- use strict
Weiter im Kurs
Zurück: Dateien, Spalten und Berichte
Weiter: Reguläre Ausdrücke vertieft
Alle Kapitel: AWK im Überblick