Remover entradas duplicadas de um arquivo CSV

9

Eu tenho um arquivo [csv] com dados duplicados reimpressos, ou seja, os mesmos dados são impressos duas vezes. Eu tentei usar o uniq do sort por sort myfile.csv | uniq -u no entanto não há alteração no myfile.csv , também eu tentei sudo sort myfile.csv | uniq -u mas não houve diferença.

Atualmente, meu arquivo csv se parece com isso

a
a
a
b
b
c
c
c
c
c

Eu gostaria de parecer

a
b
c
    
por 3kstc 12.03.2015 / 09:59

4 respostas

12

O motivo pelo qual myfile.csv não está mudando é porque a opção -u para uniq somente imprimirá linhas exclusivas. Neste arquivo, todas as linhas são duplicadas para que não sejam impressas.

No entanto, mais importante, a saída não será salva em myfile.csv , porque uniq apenas a imprimirá em stdout (por padrão, seu console).

Você precisaria fazer algo assim:

$ sort -u myfile.csv -o myfile.csv

As opções significam:

  • -u - mantém apenas linhas exclusivas
  • -o - saída para este arquivo em vez de stdout

Você deve ver man sort para mais informações.

    
por 12.03.2015 / 13:37
3

Como Belmin mostrou, o tipo é ótimo. Sua resposta é melhor para dados não classificados, e é fácil de lembrar e usar.

No entanto, também é volátil, pois altera a ordem da entrada. Se você realmente precisa que os dados passem na mesma ordem, mas removendo duplicatas posteriores, o awk pode ser melhor.

$ cat myfile.csv
c
a
c
b
b
a
c


$ awk '{if (!($0 in x)) {print $0; x[$0]=1} }' myfile.csv
c
a
b

Caso de borda estranha, mas surge de tempos em tempos.

Além disso, se seus dados já estiverem classificados quando você estiver mexendo neles, você pode simplesmente executar o uniq.

$ cat myfile.csv 
a
a
a
b
b
c
c
c
c
c


$ uniq myfile.csv 
a
b
c

O inconveniente de ambas as minhas sugestões é que você precisa usar um arquivo temporário e copiá-lo de volta.

    
por 13.03.2015 / 01:18
2

uniq -u imprime apenas linhas exclusivas. Sua entrada não possui linhas exclusivas, portanto uniq -u imprime nada. Você só precisa de sort :

sort -u myfile.csv
    
por 12.03.2015 / 10:02
1

Se você quiser manter a ordem do arquivo (não classificado), mas ainda remover duplicatas, você também pode fazer isso

awk '!v[$1]++' /tmp/file

Por exemplo

d
d
a
a
b
b
c
c
c
c
c

Ele produzirá

d
a
b
c

Apenas outro truque. Espero que ajude os outros

    
por 22.02.2017 / 02:47