1. Generelles zu AWK
AWK ist eine Programmiersprache zur Bearbeitung und Auswertung beliebiger Textdaten, u. a. auch CSV-Dateien.1
Der Name "AWK" ist aus den Anfangsbuchstaben der Nachnamen ihrer drei Autoren Alfred V. Aho, Peter J. Weinberger und Brian W. Kernighan zusammengesetzt. 2
AWK ist eine sog. Skriptsprache, deren Code nicht kompiliert, sondern von einem (Kommando)Interpreter (z.B. awk, gawk, nawk) ausgeführt wird.
Im Bereich der Korpuslinguistik eignet sich AWK z. B. für die Umwandlung eines Fließtextes in einen sog. Vertikaltext in Tabellenform. Wesentlich ist dabei die Erzeugung des sog. Referenzsystems, das die ursprüngliche Position eines Wortes innerhalb des Fließtextes bzw. innerhalb des Korpus angibt.
2. Grundsätzliche Funktionsweise
AWK durchläuft den Text zeilenweise. Der Inhalt der gelesenen Zeile wird in Felder/Fields zerlegt.
AWK ist eine prozedurale Programmiersprache Feld 1: AWK - Feld 2: ist - Feld 3: eine ...
![](https://www.dh-lehre.gwi.uni-muenchen.de/wp-content/uploads/2024/05/1450788065_Awk_demo1-300x239.jpg)
Beispieltext aus dem ICE-Corpus Hongkong. Links: Textform; rechts: Hexadezimalwerte der Schriftzeichen (erzeugt mit Programm od; Kommando: od -x t1 [dateiname]). AWK orientiert sich beim Durchlauf einer Objektdatei an Separatoren erster Ordnung (Zeilentrenner = Zeilenumbrüche = 0a bzw. 0d 0a) und zweiter Ordnung (Whitespace Characters = Leerzeichen und/oder Tabstopps = 20 und/oder 09)
AWK durchläuft die Datei von oben bis unten und zerlegt sie nach Separatoren erster ("Record separator", RS) und zweiter Ordnung (hexadezimale Zahlen 20 bzw. 09. Schreibweise als regulärer Ausdruck: [ \t]+; sog. "field separator").
2.1. Struktur
BEGIN { BEGIN-Sektion } { HAUPT-Sektion } END { END-Sektion }
3. Aufruf von AWK
Der Kommandoaufruf sieht wie folgt aus:
awk -f Skriptdatei.awk Textdatei_1.txt Textdatei_2.txt ... Textdatei_n.txt
BEGIN { print "Start"; } { print "Lese Datei zeilenweise" } END { print "Habe Datei geschlossen." }
4. Variable
FILENAME - Name der aktuell verarbeiteten Objektdatei NR - Number of Record (Nummer der aktuell gelesenen Zeile [über Dateigrenzen hinweg]) FNR - File Number of Record (Nummer der aktuell gelesenen Zeile der Objektdatei) NF - Number of Fields (Anzahl der "Felder" der aktuell gelesenen Zeile) $0 - Inhalt der aktuell gelesenen Zeile $1 - Inhalt des ersten Feldes der aktuell gelesenen Zeile $2 - Inhalt des zweiten Feldes der aktuell gelesenen Zeile ... usw. $NF - Inhalt des letzten Feldes der aktuell gelesenen Zeile RS - Record Separator (Zeilentrenner; standardmäßig: 0a [in Linux-Systemen!]) FS - Field Separator (Feldtrenner; standarmäßig: [ \t]+) OFS - Output Field Separator (Feldtrenner bei Textausgabe mit print)
MeineVariable = "AWK ist eine Skriptsprache." i = 3 xy = "abc" print i
meinArray[1] = "Dies ist das Feld 1 des Arrays" meinArray[2] = "Inhalt des Feldes 2"
5. Operatoren
1. Zuweisungsoperator
- = einem Wert zu einer Variable zuweisen
2. Vergleichsoperatoren
- == gleich
- != ungleich
- ~ match
- !~ not match
3. Arithmetische Operatoren
- + Addition
- - Subtraktion
- ++ Inkrement um den Wert 1
- -- Dekrement um den Wert 1
- * Multiplikation
- / Division
- % Modulo (ganzzahliger Rest einer Division)
6. Ablaufsteuerung
# Beispiel für eine Bedingung: { if ($1 == "ist") { print $1 } else { print " ... " } } # Mehrere Bedingungen: && (= und) und || (= oder) # Reguläre Ausdrücke: ... if ($i ~ /[.,;?!"]$/) { ... # Beispiel für eine Schleife: BEGIN { for (i=1; i<=3; i=i+1) { print i } } # Beispiel für den Durchlauf aller Felder der aktuell gelesenen Zeile: { for (i=1; i<=NF; i++) { print i, $i } }
7. Funktionen
funktionsname(Parameter1, Parameter2, ... ParameterN)
gensub() # Ersetzung von Zeichenketten split() # Zerlegung eines Strings nach einem Separator in einzelne Felder asort(source [, dest [, how ] ]) # Sortiert Arrays nach den Values asorti(source [, dest [, how ] ]) # Sortiert Arrays nach den Keys index(in, find) # length([string]) # Ermittelt die Länge eines Strings match(string, regexp) # Lokalisiert den Beginn eines Teilstrings in "string"
8. Beispiel3
{ print NR ". Das Spiel zwischen" , $1 , "und" , $3 , "haben" , $10 , $NF , "gesehen"; }
Ausgabe:
1. Das Spiel zwischen Bayern und Nürnberg haben 69000 Zuschauer gesehen
2. Das Spiel zwischen Frankfurt und Leverkusen haben 47600 Zuschauer gesehen
3. Das Spiel zwischen Stuttgart und Hannover haben 49000 Zuschauer gesehen
4. Das Spiel zwischen Schalke und Karlsruhe haben 61482 Zuschauer gesehen
5. Das Spiel zwischen Hertha und Cottbus haben 48719 Zuschauer gesehen
6. Das Spiel zwischen Bielefeld und Hamburg haben 22800 Zuschauer gesehen
7. Das Spiel zwischen Wolfsburg und Rostock haben 26127 Zuschauer gesehen
8. Das Spiel zwischen Duisburg und Bremen haben 31006 Zuschauer gesehen
9. Das Spiel zwischen Dortmund und Bochum haben 72200 Zuschauer gesehen
Bibliographie
- Lücke u.a. 2017a = Lücke, Stephan / Riepl, Christian / Trautmann, Caroline (2017): Korpus im Text. Softwaretools und Methoden für die korpuslinguistische Praxis, vol. 1, München, Universitätsbibliothek der LMU, LMU/ITG [Open-Access-Version; ISBN: 978-3-95896-016-9 (elektronische Version)] (Link).