Mantendo a primeira instância de duplicatas

5

Eu tenho um arquivo com várias colunas e identifiquei linhas em que valores de coluna específicos (cols 3-6) foram duplicados usando um script bash.

Exemplo de entrada:

A B C D E F G
1 2 T TACA A 3 2 Q
3 4 I R 8 2 Q
9 3 A C 9 3 P
8 3 I R 8 2 Q

Eu posso exibir as duas instâncias dos valores repetidos. Os outros valores da coluna (cols 1, 2 e 7+) podem ser diferentes entre as duas linhas, portanto, é necessário que eu veja ambas as instâncias.

Eu quero salvar os registros exclusivos e a primeira instância dos registros duplicados depois de classificar esses dups que foram classificados na col 5 (qualquer ordem servirá) e col 1 (ordem decrescente - primeiro maior valor). / p>

Saída desejada:

A B C D E F G
1 2 T TACA A 3 2 Q
9 3 A C 9 3 P
8 3 I R 8 2 Q

NB: A encomenda na saída final não é importante, uma vez que será aplicada mais tarde. Certificar-se de que as linhas desejadas estão presentes é o que importa.

Meu código até agora é:

tot=$(awk 'n=x[$3,$6]{print n"\n"$0;} {x[$3,$6]=$0;}' oldfilename | wc -l)  #counts duplicated records and saves overall count as $tot
if [ $tot == "0" ] 
then
    awk '{print}' oldfilename >> newfilename  #if no dups found, all lines saved in new file
else if
    awk '(!(n=x[$3,$6]{print n"\n"$0;} {x[$3,$6]=$0;})' oldfilename >> newfilename  #if dups found, unique lines in old file saved in new file
else
    awk 'n=x[$3,$6]{print n"\n"$0;} {x[$3,$6]=$0;}' oldfilename > tempfile  #save dups in tempfile
    sort -k1,1, -k5,5 tempfile  #sort tempfile on cols 1 then 5 (want descending order)                  
fi

O que eu não consigo fazer é pegar a primeira instância de cada duplicata e salvá-la no newfile e ainda tenho erros no código acima.

Por favor ajude.

    
por Bob 16.09.2015 / 14:38

2 respostas

5

sort em si deve ser suficiente. Primeiro classifique de tal forma que as linhas sejam "agrupadas" pelo intervalo de campo 3-6 , os registros dentro de cada grupo ordenados ainda pelos campos 5 e 1 . Pipe isto para sort -u on 3-6 , isso desativa a comparação de último recurso e retorna o primeiro registro de cada grupo 3-6 . Finalmente, canalize isso para sort , desta vez pelos campos 5 e 1

sort -k3,6 -k5,5r -k1,1r file | sort -k3,6 -u | sort -k5,5r -k1,1r
A B C D E F G
1 2 T TACA A 3 2 Q
9 3 A C 9 3 P
8 3 I R 8 2 Q
    
por 16.09.2015 / 14:53
1

Se eu entendi corretamente, isso deve ser suficiente:

$ sort input | uniq -f 2
1 2 T TACA A 3 2 Q
3 4 I R 8 2 Q
9 3 A C 9 3 P
A B C D E F G

A opção -f 2 informa uniq para pular a comparação dos dois primeiros campos. Por conseguinte, manterá a 1ª instância de quaisquer 3 últimos campos duplicados.

    
por 16.09.2015 / 15:31