Remover linhas não duplicadas no Linux

2

como posso remover linhas não duplicadas do arquivo de texto usando qualquer programa linux sed, awk ou qualquer outro?

Exemplo:

abc
bbc
abc
bbc
ccc
bbc

Resultado:

abc
bbc
abc
bbc
bbc

A segunda lista removeu ccc porque não tinha linhas duplicadas.

É também possível remover linhas, que são não-duplicadas E linhas que possuem apenas 2 duplicatas, e deixar aquelas que têm mais de 2 linhas duplicadas?

    
por qlwik 02.08.2016 / 07:56

2 respostas

5

As soluções postadas por outras pessoas não funcionam no Debian Jessie: elas mantêm uma cópia única de qualquer linha duplicada, enquanto eu entendo o OP que tudo cópias das linhas duplicadas devem ser mantidas. Se eu entendi o OP certo, então ...

  1. O seguinte comando

    awk '!seen[$0]++' file
    

    remove todas as linhas duplicadas.

  2. O seguinte comando

    awk 'seen[$0]++' file 
    

    exibe todas as duplicatas, mas não a cópia original: isto é, , se uma linha aparecer n vezes, gera a linha n-1 tempos

  3. Então o comando

    awk 'seen[$0]++' file > temp && awk '!seen[$0]++' file >> temp
    

    resolve o seu problema. As linhas não estão na ordem original.

  4. Se você deseja criar linhas com duas ou mais duplicatas, agora pode iterar as etapas acima:

    awk 'seen[$0]++' file | awk 'seen[$0]++' > temp
    

    mantém n-2 cópias das linhas que têm n > 1 duplicadas. Agora

    awk '!seen[$0]++' temp > temp1 
    

    remove todas as linhas duplicadas do arquivo temporário, e agora você pode obter o que deseja ( isto é, somente as linhas com n > 1 duplicadas) como segue:

    cat temp1 >> temp; cat temp1 >> temp
    
  5. Se você precisar fazer isso para linhas que aparecem N ou mais vezes, o seguinte comando

      awk 'seen[$0]++ && seen[$0] > N' file 
    

    é mais simples que encadear N vezes o comando awk 'seen[$0]++' file .

por 02.08.2016 / 08:36
3

Você pode usar sort & uniq comandos para isso.

Se seus dados estiverem no arquivo abc.txt, então;

cat abc.txt |sort|uniq -d

A saída será

abc 
bbc
    
por 02.08.2016 / 08:37