Deduplicación con awk en línea de comando y script

Deduplicación con awk en línea de comando y script

Tengo un archivo que tiene el siguiente formato:

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

Como puedes ver, es un texto separado por comas con duplicados. Me gustaría deduplicar el texto con respecto a la columna 1 usando awk.

Línea de comando

Si uso la interfaz shell, esto es lo que obtengo

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

que es lo que esperaría del siguiente comando

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

guión extraño

Si uso el script awk escrito de la siguiente manera

#!/bin/awk -f

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

No obtengo ningún resultado. ¿Hay algún problema con el guión? ¿Por qué el comportamiento es diferente entre el script y la línea de comando?

Respuesta1

Fuera de los frenos, !a[$1]++es uncondición, que desencadena la acción predeterminada {print}si se evalúa como verdadero (distinto de cero).

Dentro de los brackets, {{!a[$1]++}}es unacciónque se evalúa incondicionalmente sin efectos secundarios. Quitar los brackets:

#!/bin/awk -f

BEGIN {
    FS=","
}

!a[$1]++

Respuesta2

La extraña respuesta de @steeldriveres correcto y probablemente sea todo lo que necesita, pero si su entrada se vuelve masiva, puede quedarse sin memoria y/o volverse relativamente lenta y, en ese caso, aquí hay un enfoque de decorar/ordenar/desdecorar que continuará funcionando:

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

información relacionada