GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie funktioniert Awk ‘!a[$0]++’?

Dieser Einzeiler entfernt doppelte Zeilen aus der Texteingabe ohne Vorsortierung.

Zum Beispiel:

$ cat >f
q
w
e
w
r
$ awk '!a[$0]++' <f
q
w
e
r
$ 

Der Originalcode, den ich im Internet gefunden habe, lautet:

awk '!_[$0]++'

Das war für mich noch verwirrender, als ich _ nahm in awk eine besondere Bedeutung haben, wie in Perl, aber es stellte sich heraus, dass es sich nur um den Namen eines Arrays handelte.

Jetzt verstehe ich die Logik hinter dem Einzeiler:
Jede Eingabezeile wird als Schlüssel in einem Hash-Array verwendet, daher enthält der Hash nach Abschluss eindeutige Zeilen in der Reihenfolge des Eintreffens.

Was ich gerne lernen möchte, ist, wie genau diese Notation von awk interpretiert wird. Z.B. was zum Knallzeichen (! ) bedeutet und die anderen Elemente dieses Codeausschnitts.

Wie funktioniert es?

Akzeptierte Antwort:

Hier ist eine „intuitive“ Antwort, für eine ausführlichere Erklärung des awk-Mechanismus siehe entweder @Cuonglm’s

In diesem Fall !a[$0]++ , das Post-Inkrement ++ kann für einen Moment beiseite gelegt werden, es ändert nichts am Wert des Ausdrucks. Sehen Sie sich also nur !a[$0] an . Hier:

a[$0]

verwendet die aktuelle Zeile $0 als Schlüssel zum Array a , wobei der dort gespeicherte Wert genommen wird. Wenn auf diesen bestimmten Schlüssel noch nie zuvor verwiesen wurde, a[$0] ergibt eine leere Zeichenfolge.

!a[$0]

Der ! negiert den Wert von vorher. Wenn es leer oder null (falsch) war, haben wir jetzt ein wahres Ergebnis. Wenn es nicht Null (wahr) war, haben wir ein falsches Ergebnis. Wenn der gesamte Ausdruck als wahr ausgewertet wird, bedeutet dies, dass a[$0] von vornherein nicht gesetzt war, wird als Standardaktion die ganze Zeile gedruckt.

Außerdem fügt der Post-Increment-Operator unabhängig vom alten Wert eins zu a[$0] hinzu , wenn also das nächste Mal auf denselben Wert im Array zugegriffen wird, ist er positiv und die gesamte Bedingung schlägt fehl.


Linux
  1. Was ist ein Makefile und wie funktioniert es?

  2. Was ist NGINX? Wie funktioniert es?

  3. Was ist ein Webserver und wie funktioniert ein Webserver?

  4. Wie funktioniert Rm? Was macht Rm?

  5. Wie funktioniert sig_atomic_t eigentlich?

Wie funktioniert Git?

Wie funktioniert SFTP?

Ssh – Wie funktioniert Reverse-SSH-Tunneling?

Linux – Wie funktioniert die Anzeige von Linux?

Wie funktioniert Swap-Speicher in Linux?

Wie funktioniert die Anzeige von Linux?