Deduplicação com awk na linha de comando e script

Deduplicação com awk na linha de comando e script

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

informação relacionada