Tenho um arquivo que tem o seguinte 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 você pode ver, é um texto separado por vírgula com duplicatas. Gostaria de desduplicar o texto em relação à coluna 1 usando awk
.
Linha de comando
Se eu usar a interface shell, é isso que recebo
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 é o que eu esperaria do seguinte comando
awk -F"," '!a[$1]++' filename.csv
Script estranho
Se eu usar o script awk escrito da seguinte maneira
#!/bin/awk -f
BEGIN {
FS=","
}
{
{!a[$1]++}
}
Eu não recebo nenhuma saída. Há algo errado com o roteiro? Por que o comportamento é diferente entre o script e a linha de comando?
Responder1
Fora do aparelho, !a[$1]++
é umdoença, que aciona a ação padrão {print}
se for avaliada como verdadeira (diferente de zero).
Dentro do aparelho, {{!a[$1]++}}
há umAçãoque é avaliado incondicionalmente sem nenhum efeito colateral. Remova o aparelho:
#!/bin/awk -f
BEGIN {
FS=","
}
!a[$1]++
Responder2
Resposta estranha de @steeldriverestá correto e provavelmente é tudo que você precisa, mas se sua entrada ficar enorme, ela pode ficar sem memória e/ou ficar relativamente lenta e, nesse caso, aqui está uma abordagem de decorar/classificar/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