Die Programmiersprache AWK: Grundlagen (ITG/slu)




1. Generelles zu AWK

AWK ist eine Programmiersprache zur Bearbeitung und Auswertung beliebiger Textdaten, u. a. auch CSV-Dateien.1

AWK Programming Language

Der Name "AWK" ist aus den Anfangsbuchstaben der Nachnamen ihrer drei Autoren Alfred V. Aho, Peter J. Weinberger und Brian W. Kernighan zusammengesetzt. 2

The AWK Programming Language (Addison-wesley Professional Computing)

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 ...

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

Die Datensicht von AWK – Einteilung in ↗Zeilen (records) und Felder (fields)

{
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).

Schreibe einen Kommentar