Gawk/Beispiele: Unterschied zwischen den Versionen
Zeile 120: | Zeile 120: | ||
awk: run time error: negative field index $-1 | awk: run time error: negative field index $-1 | ||
FILENAME="beispiel2" FNR=3 NR=3 | FILENAME="beispiel2" FNR=3 NR=3 | ||
*Die Anweisung muss so geändert werden: | |||
$ awk '{if($0 ~ /^$/){print $0}else{print $(NF-1)}}' beispiel2 | |||
----------------------- | |||
mit | |||
Eine | |||
& | |||
war | |||
und | |||
am | |||
stimmt | |||
Doch |
Version vom 18. Juni 2020, 13:12 Uhr
AWK ist eine Programmiersprache um Textdateien zu ändern.
Einführung
- AWK kann man aufrufen durch
- awk-Kommando in der Shell-Konsole
- In Shell- oder in awk-Scripte
- awk wartet auf Daten von Eingabeströmen aus Dateien oder aus der Standardeingabe
- awk arbeitet Zeile für Zeile bis zum Dateiende
Syntax & Aufbau
Die allgemeine Syntax lautet:
$ awk 'Programm' Datei oder $ awk -f Programmdatei Datei
Der Aufbau eines awk-Programms:
- Optionaler Anfang(BEGIN), der einmalig ausgeführt wird
- Hauptprogramm aus Anweisungen, das für jede Eingabezeile erneut ausgeführt wird
- Optionales Ende(END), der einmalig ausgeführt wird
Eine Anweisung wiederum:
- hat ein optionales Muster
- gefolgt von einem Kommandoblock in geschweiften Klammern
/Muster/ {Kommando; Kommando; ... }
Ein Beispiel:
BEGIN{ print "Zählen von Eingabezeilen"; zaehler=0; } { zaehler++; } END{ print "Ergebnis: " zaehler; }
Anwendungen
Eine einfache Textdatei:
1. Hier ist ein Text mit Inhalt A Eine Zeile 2. Tim & Struppi A Was war das? B Aktion und Reaktion 3. Reisig schmeckt am Besten A Nein, stimmt nicht B Doch !
Einzeiler-Kommandos
- Gibt Anzahl der Eingabezeilen zurück
$ awk 'END {print NR}' ---------------------- 10
- Zeile Nr. 5 zurückgeben
$ awk 'NR == 5' ---------------------- A Was war das?
- Zeilen ab Zeile Nr.6 ausgeben
$ awk 'NR > 6' ---------------------- 3. Reisig schmeckt am Besten A Nein, stimmt nicht B Doch !
- Zeilen ausgeben mit mehr als 4 Felder
$ awk 'NF > 4' ---------------------- 1. Hier ist ein Text mit Inhalt 3. Reisig schmeckt am Besten
- Jede Zeile mit einer Zeilennummer versehen
$ awk '{print NR, $0}' ----------------------- 1 1. Hier ist ein Text mit Inhalt 2 A Eine Zeile 3 4 2. Tim & Struppi 5 A Was war das? 6 B Aktion und Reaktion 7 8 3. Reisig schmeckt am Besten 9 A Nein, stimmt nicht 10 B Doch !
Wichtige Variablen
- awk arbeitet unter der Annahme, dass die Eingabe strukturiert ist
- Jedes Feld ist eine Zeichenfolge, die durch Feldseperatoren (meistens Leerzeichen oder Tabulator) begrenzt ist
- $ ist der Feldoperator
- $1 ist das erste Feld.
- $0 steht für die gesamte Zeile, die gerade bearbeitet wird.
$ awk '{print $1}' ----------------------- 1. A 2. A B 3. A B
- $NF steht für das letzte Feld
- $(NF-1) gibt das vorletzte Feld wieder. (Achtung: Bei Leerzeilen führt es zu Laufzeitfehler)
$ awk '{print $(NF-1)}' ----------------------- mit Eine awk: run time error: negative field index $-1 FILENAME="beispiel2" FNR=3 NR=3
- Die Anweisung muss so geändert werden:
$ awk '{if($0 ~ /^$/){print $0}else{print $(NF-1)}}' beispiel2 ----------------------- mit Eine & war und am stimmt Doch