Awk: Grundlagen: Bedingungen


Mittels Bedingung(en) kann eine Filterung der zu bearbeitenden Datensätze erfolgen.

Vergleichsoperatoren

Bearbeiten

Eine Bedingung ergibt sich oftmals aufgrund eines Vergleiches zweier Elemente. Die Aktion wird dann ausgeführt, wenn das Ergebnis des Vergleiches ein logisches TRUE ergibt.

Beispiel: Die Eingabedatei test2.txt habe folgenden Inhalt:

1  5  
5  6
8  2
7  7
8  1

Alle Datensätze, in denen das erste Feld einen größeren Wert als das zweite Feld hat, sollen auf der Standardausgabe ausgegeben werden.

Das awk-Skript test.awk lautet also:

$1>$2 {print $0}

Mit folgendem awk-Kommando wird die Eingabedatei in gewünschter Weise ausgewertet

awk -f test.awk test2.txt

Ergebnis:

8  2
8  1


Mögliche Vergleichsoperatoren für awk-Bedingungen sind:

Operator Beschreibung
== ist gleich
< kleiner als
> größer als
<= kleiner gleich
>= größer gleich
!= ungleich
~ enthält (relevant für reguläre Ausdrücke)
!~ enthält nicht (relevant für reguläre Ausdrücke)

Verknüpfungen

Bearbeiten

Teilbedingungen können auch zu einer Gesamtbedingung verknüpft werden. Zu diesem Zwecks gibt es die Operatoren && (logisches UND), || (logisches ODER) und ! (logische Negation).

Beispiel:

Eingabedatei test2.txt:

1  5  
5  6
8  2
7  7
8  1

Alle Datensätze, in denen das erste Feld einen größeren Wert als das zweite besitzt UND das zweite Feld eine 1 darstellt, sollen auf der Standardausgabe ausgegeben werden.

awk-Skript test3.awk:

$1>$2 && $2==1 {print $0}

awk-Kommando:

awk -f test3.awk test2.txt

Ergebnis:

8  1


Wenn nur eine Bedingung und keine Aktion angegeben wird, dann werden alle Zeilen ausgegeben, die der Bedingung entsprechen. Das Skript test3.awk aus dem letzten Kapitel würde also dasselbe Ergebnis liefern, wenn '{print $0}' weggelassen wird.

awk-Skript test3b.awk:

$1>$2 && $2==1

Leere Bedingung

Bearbeiten

Wird keine Bedingung angegeben, so wird die entsprechende Aktion für alle Zeilen der Eingabe bzw. der Eingabedatei(en) durchgeführt.

Beispiel:

awk-Skript test3a.awk zur Bearbeitung der Datei test2.txt aus dem letzten Kapitel:

{print $1}

awk-Kommando:

awk -f test3a.awk test2.txt

Ergebnis:

1 
5 
8 
7 
8

BEGIN und END

Bearbeiten

awk kennt die Bedingungen BEGIN und END. Eine mit der BEGIN-Bedingung verknüpfte Aktion wird vor dem Lesen des ersten Datensatzes ausgeführt. Eine mit einer END-Bedingung verknüpfte Aktion wird nach dem Lesen des letzten Datensatzes abgearbeitet.

Beispiel: Ein Dateilisting soll in eine Ausgabedatei geschrieben werden. In der Ausgabedatei sollen an erster Stelle Firma und Abteilung aufgelistet werden und ganz zum Schluss der Vermerk --- ENDE --- .

awk-Skript test.awk:

BEGIN {print "Firma: XYZ"
       print "Abteilung: X123"}
END {print "---ENDE---"}
{print $0}

awk-Kommando:

ls | awk -f test.awk > ausgabe.txt

Der Inhalt der Ausgabedatei ausgabe.txt könnte beispielsweise so aussehen:

Firma: XYZ 
Abteilung: X123 
bin 
doc 
include 
lib 
tmp 
X11
---ENDE---

Suchmuster / Regulärer Ausdruck

Bearbeiten

Soll nach dem Vorkommen bestimmter Textmuster gefiltert werden, so helfen uns die bisherigen Methoden nicht weiter. Dann ist der Einsatz von Suchmustern in Form regulärer Ausdrücke ein probates Mittel zur Problemlösung. Suchmuster sind in Schrägstriche einzukapseln /regexp/.

Beispiel: Eine Personendatenbank soll gefiltert werden. Alle Personen, deren Vorname mit M beginnt sollen ausgegeben werden.

Die Eingabedatei personendatenbank.txt sieht folgendermaßen aus:

Mimi    P    13.08.2005
Susi    T    23.09.1999
Fritz   X    03.03.2001
Max     P    17.11.1985

awk-Skript:

$1~/^M/ {print $0}

Ausgabe:

Mimi    P    13.08.2005 
Max     P    17.11.1985

Bereiche

Bearbeiten

Soll eine Aktion nur innerhalb eines bestimmten Bereichs der Eingabe(datei[en]) ausgeführt werden, so kann die daraus resultierende Gesamtbedingung folgendermaßen angegeben werden

Bedingung1, Bedingung2 {Aktion}

Die Aktion wird dann ab dem Zutreffen der Bedingung1 bis zum Zutreffen der Bedingung 2 (inklusive) ausgeführt. Als Vergleichsoperatoren in den Bedingungen eignen sich dabei nur == und ~.