Deduplizierung mit awk auf der Kommandozeile und per Skript

Deduplizierung mit awk auf der Kommandozeile und per Skript

Ich habe eine Datei mit folgendem Format:

487422,Potenza
487386,Forlì-Cesena
487399,Grosseto
487425,Catanzaro
487409,Napoli
487446,Prato
495498,Fermo
487425,Catanzaro
487389,Macerata
487442,Biella
487351,Asti
487424,Cosenza
487404,Roma
487359,Como
487404,Roma
487401,Terni
487420,Brindisi
487397,Arezzo
487348,Vercelli
487382,Modena
487356,Genova
487365,Cremona
487369,Verona
487386,Forlì-Cesena

Wie man sieht, handelt es sich um einen kommagetrennten Text mit Duplikaten. Ich möchte den Text bezüglich Spalte 1 mit deduplizieren awk.

Befehlszeile

Wenn ich die Shell-Schnittstelle verwende, erhalte ich Folgendes:

487422,Potenza
487386,Forlì-Cesena
487399,Grosseto
487425,Catanzaro
487409,Napoli
487446,Prato
495498,Fermo
487389,Macerata
487442,Biella
487351,Asti
487424,Cosenza
487404,Roma
487359,Como
487401,Terni
487420,Brindisi
487397,Arezzo
487348,Vercelli
487382,Modena
487356,Genova
487365,Cremona
487369,Verona

das ist, was ich von dem folgenden Befehl erwarten würde

awk -F"," '!a[$1]++' filename.csv

Awk-Skript

Wenn ich das Awk-Skript verwende, das wie folgt geschrieben ist

#!/bin/awk -f

BEGIN {
    FS=","
}
{
    {!a[$1]++}
}

Ich erhalte keine Ausgabe. Stimmt etwas mit dem Skript nicht? Warum ist das Verhalten zwischen dem Skript und der Befehlszeile unterschiedlich?

Antwort1

Außerhalb der Klammern !a[$1]++ist einZustand, das die Standardaktion auslöst, {print}wenn es als wahr (ungleich Null) ausgewertet wird.

Innerhalb der Klammern {{!a[$1]++}}befindet sich einAktiondas bedingungslos und ohne Nebeneffekte ausgewertet wird. Entfernen Sie die Klammern:

#!/bin/awk -f

BEGIN {
    FS=","
}

!a[$1]++

Antwort2

@steeldrivers awk-Antwortist richtig und wahrscheinlich alles, was Sie brauchen, aber wenn Ihre Eingabe sehr umfangreich wird, kann es sein, dass der Speicher voll ist und/oder die Datei relativ langsam wird. In diesem Fall gibt es hier einen Ansatz zum Dekorieren/Sortieren/Aufheben der Dekoration, der weiterhin funktioniert:

nl -w1 -s, file |       # Decorate by prefixing with line numbers
sort -ut, -k2,2 |       # Sort uniquely by the real key field
sort -nt, -k1,1 |       # Sort whats left by the line numbers we added
cut -d, -f2-            # Undecorate by removing the line numbers

verwandte Informationen