Remover linhas duplicadas de um arquivo de texto é uma tarefa comum em scripts Bash. Este artigo explora dois métodos eficientes: usando sort
e uniq
, e aproveitando o poder do awk
.
Sumário
Usando sort
e uniq
Esta abordagem combina duas utilidades Unix fundamentais para uma solução simples. sort
organiza as linhas alfabeticamente, um pré-requisito para uniq
, que então elimina duplicatas consecutivas. A ordem da *primeira* ocorrência de cada linha é preservada.
Aqui está o comando:
sort file.txt | uniq > file_unique.txt
Isso direciona a saída ordenada de file.txt
para uniq
, salvando as linhas únicas em file_unique.txt
. O arquivo original permanece intocado.
Exemplo:
Se file.txt
contém:
apple
banana
apple
orange
banana
grape
file_unique.txt
conterá:
apple
banana
grape
orange
Usando o comando awk
awk
oferece uma solução mais flexível e poderosa, particularmente útil quando a preservação da ordem original das linhas é crucial. Ele emprega um array associativo para rastrear as linhas encontradas.
O comando é notavelmente conciso:
awk '!seen[$0]++' file.txt > file_unique.txt
Vamos analisar:
$0
representa toda a linha atual.seen[$0]
acessa um elemento no arrayseen
, usando a linha como chave.++
pós-incrementa o valor (inicialmente 0).!
nega o resultado; a linha é impressa apenas se for encontrada pela primeira vez (quandoseen[$0]
é 0).
Este método mantém a ordem original das linhas.
Exemplo:
Usando o mesmo file.txt
, a saída em file_unique.txt
será:
apple
banana
orange
grape
Conclusão:
Ambos os métodos removem linhas duplicadas efetivamente. sort | uniq
é mais simples para cenários básicos, enquanto awk
fornece flexibilidade e controle superiores, especialmente para preservar a ordem original ou lidar com necessidades mais complexas de remoção de duplicatas.