Comandos / script Bash para remover uma linha do CSV com duplicata na coluna

3

Eu tenho muitos arquivos CSV que eu combinei. No entanto, existem duplicatas, mas a linha inteira não é duplicada. Eu tenho uma coluna que eu quero usar como critério para procurar uma duplicata. E se houver uma duplicata nessa coluna da coluna inteira, exclua as linhas que contêm as duplicatas nas colunas até que você tenha todos os valores exclusivos nessa coluna.

Alguém sabe a melhor maneira de fazer isso no Bash, sed ou awk?

    
por Peaceful_Warrior 22.03.2013 / 17:02

3 respostas

5

awk -F, '!seen[$1]++'

$1 é a primeira coluna, mude conforme apropriado; você pode usar várias colunas separadas por vírgulas ( [$1,$3] ) ou $0 para a linha inteira.

    
por 22.03.2013 / 19:31
3

Bash é difícil, mas você pode chamar Perl de Bash? Se seus campos estiverem separados por vírgulas e seu campo-chave for o segundo,

$ cat a.csv
11,22,33
214,22,354
6,6,6
4,5,7
1,22,1

este forro será impresso se ainda não tiver visto a segunda coluna:

$ perl -ne '$value = (split /,/)[1]; print unless $x{$value}++;' a.csv 
11,22,33
6,6,6
4,5,7

O [1] é o número da coluna e é baseado em zero.

    
por 22.03.2013 / 18:26
0

Se houver campos que contenham caracteres delimitadores dentro de aspas (não funciona com o Ruby 1.8):

$ ruby -rcsv -e 'puts CSV.parse($<).uniq{|l|l[1]}.map(&:to_csv)' <<< $'"1,9",3\n4,8\n7,3'
"1,9",3
4,8
    
por 23.03.2013 / 12:50

Tags