Como remover duplicatas usando awk em 1th ~ 46th column of 47 field csv file?

0

Eu tenho um script bash para combinar muitos arquivos em um único arquivo csv. Este arquivo csv possui 47 campos e várias 10.000 linhas.

Para remover duplicatas, usei awk '!seen[$0]++' . No entanto, para classificar, adicionei uma referência à origem de origem na coluna 47.

Eu ainda quero apenas indexar na coluna 1 a 46 e imprimir todos, incluindo 47.

Devo listar todos os 46 como em awk '!seen[$1, $2, $3, ,..etc.., $45, $46]++ 'ou há uma maneira mais fácil?

    
por triedonce 20.08.2017 / 12:36

3 respostas

0

Tente isto:

$ cat file
1 2 3 4
5 6 7 8
1 2 3 x
a b c d
5 6 7 y

Olhando para os 3 primeiros campos como "chave", queremos descartar as linhas 2 "1 2 3" e 2 "5 6 7"

awk '
    {
        line = $0     # remember the original state of this line
        NF--          # forget about the last field
    }
    !seen[$0]++ {print line}   # if the "new" line is unique, print the "old" line
' file
1 2 3 4
5 6 7 8
a b c d
    
por 20.08.2017 / 17:22
1
'sort_field=$47; $47=""; !seen[$0]++ { print $0 " " sort_field }' 
    
por 20.08.2017 / 12:54
0

Use sort e imprima linhas exclusivas com sua opção uniqe -u com base em 1 ~ 46 campos k1,46 ?

sort -uk1,46 infile.txt

se seus arquivos de entrada forem separados por vírgula .csv, você poderá especificar isso com -t',' .

sort -t',' -uk1,46 infile.txt

Para entrada abaixo como amostra:

1,2,3,4
5,6,7,8
1,2,3,x
a,b,c,d
5,6,7,y

A saída é:

1,2,3,4
5,6,7,8
a,b,c,d
    
por 20.08.2017 / 19:00