Erklärung zu awk (doppelte Zeilen elemenieren)

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Erklärung zu awk (doppelte Zeilen elemenieren)

Beitrag von Duff » 30.09.2011 08:30:34

Hallo,

ich suche nach einer guten Erklärung für die folgende awk-Zeile:

Code: Alles auswählen

awk '{if (a[$0]==0) {a[$0]=1; print}}' file.txt
Damit werden alle doppelten Zeilen nur einmal ausgegeben.

In dem Array a wird die gesamte Zeile durch $0 gespeichert. Wie ist in diesem Zusammenhang die if-Anweisung mit überprüfung auf 0 zu verstehen?
Danke.
Oh, yeah!

uname
Beiträge: 12419
Registriert: 03.06.2008 09:33:02

Re: Erklärung zu awk (doppelte Zeilen elemenieren)

Beitrag von uname » 30.09.2011 09:18:59

Solange eine Zeile unbekannt ist entspricht a[Zeile] dem Wert "0" und wird über "if" per "print" ausgegeben. Wenn die Zeile ausgegeben wird wird zudem der Wert auf "1" gesetzt, so dass der Inhalt der if-Schleife für gleiche Zeilen nicht mehr erreicht wird. Die Zeile wird kein zweites Mal ausgegeben, was ja Sinn des Programms ist. Ok, gut ist die Erklärung nicht. Vielleicht ein Ablaufdiagramm malen.

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Erklärung zu awk (doppelte Zeilen elemenieren)

Beitrag von Meillo » 30.09.2011 11:17:44

Ich finde die Erklaerung nicht schlecht. Entscheidend ist halt zu verstehen, dass ein undefinierter Eintrag in a als false gewertet wird. Jede Zeile die noch nicht da war wird in a abgelegt (um zu notieren, dass sie schonmal da war) und danach ausgegeben.


Hier ist uebrigens noch eine alternative Schreibweise fuer das Programm. Sie ist im Vergleich zu Code in anderen Sprachen vielleicht ungewohnt, aber dafuer IMO treffender aus awk-Sicht:

Code: Alles auswählen

!a[$0] {a[$0]=1; print}
Erklaerung: Fuer alle Zeilen in denen a[$0] undefiniert ist (= Zeile zum ersten Mal da): definiere a[$0] und gebe die Zeile aus.
Use ed once in a while!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: Erklärung zu awk (doppelte Zeilen elemenieren)

Beitrag von Duff » 30.09.2011 15:27:10

Danke. Dann hat in awk false den Wert 0 und true den Wert 1.
Oh, yeah!

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Erklärung zu awk (doppelte Zeilen elemenieren)

Beitrag von Meillo » 30.09.2011 15:55:15

Duff hat geschrieben:Dann hat in awk false den Wert 0 und true den Wert 1.
Ja.

Umgekehrt ist es dann so: Die Zahl 0 und der Leerstring ("") werden als false gewertet, alles andere als true.
Use ed once in a while!

yeti

Re: Erklärung zu awk (doppelte Zeilen elemenieren)

Beitrag von yeti » 30.09.2011 16:59:32

Code: Alles auswählen

$ echo -e 'appl\nbirne\nappl\nbanane\nbanane\nbirne\nkiwi'
appl
birne
appl
banane
banane
birne
kiwi
$ echo -e 'appl\nbirne\nappl\nbanane\nbanane\nbirne\nkiwi' | awk '!a[$0] && a[$0]=1'
appl
birne
banane
kiwi
...einfach endgeil, dieses awk!

Antworten