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