CLI AI

Remover linhas duplicadas, com ou sem ordenar

2026-08-01

sort -u file.txt remove as linhas repetidas e ordena o que sobrou; awk '!seen[$0]++' file.txt remove as repetidas e mantém a ordem original. Qual você quer depende de a ordem significar alguma coisa — num log ela sempre significa. O uniq sozinho não faz nem uma coisa nem outra.

1. Por que o uniq sozinho não resolve

clai
$ clai remova as linhas duplicadas do access.log→ uniq access.log10.0.0.710.0.0.310.0.0.710.0.0.910.0.0.310.0.0.710.0.0.1

O arquivo voltou igual. O uniq só junta linhas idênticas vizinhas, e num arquivo real as repetições estão espalhadas. Daí a dupla clássica sort | uniq.

2. Remover duplicatas e ordenar

clai
$ clai remova as duplicatas e ordene o arquivo→ sort -u access.log10.0.0.110.0.0.310.0.0.710.0.0.9

O sort -u faz os dois serviços numa passada — mais curto e mais rápido que canalizar para o uniq.

3. Remover duplicatas mantendo a ordem

clai
$ clai remova as duplicatas mas mantenha a ordem original das linhas→ awk '!seen[$0]++' access.log10.0.0.710.0.0.310.0.0.910.0.0.1

Essa é a diferença real para o sort -u: sobrevive a primeira ocorrência de cada linha e a ordem fica intacta, o que importa em logs e em tudo que é escrito em ordem cronológica. O preço é memória: o awk guarda cada linha distinta, e isso aparece em arquivos de vários gigabytes.

4. Quantas vezes cada linha aparece

clai
$ clai conte quantas vezes cada linha aparece→ sort access.log | uniq -c | sort -rn      3 10.0.0.7      2 10.0.0.3      1 10.0.0.9      1 10.0.0.1

A receita do "top N" para logs. O uniq -c conta e o segundo sort -rn joga as frequentes para cima.

5. Só as linhas que se repetiram

clai
$ clai mostre só as linhas que aparecem mais de uma vez→ sort access.log | uniq -d10.0.0.310.0.0.7

-d mantém só as duplicadas; -u faz o contrário e mantém só as que aparecem uma vez — 10.0.0.1 e 10.0.0.9 neste arquivo. Útil quando você compara duas listas.

6. Deduplicar por um campo

clai
$ clai deixe uma linha por URL→ awk '!seen[$2]++' req.logGET /a 200GET /b 404

$2 é o segundo campo. É assim que se colapsa um log por URL, por IP ou por id de sessão, mantendo inteira a primeira linha correspondente.

Gotchas

  • sort -u arquivo > arquivo esvazia o arquivo. Verificado: o shell trunca o arquivo para escrita antes de o sort sequer ler, e você fica com zero linhas. Use sort -u arquivo -o arquivo — o sort tem uma flag para gravar sobre a própria entrada, e ela funciona.
  • uniq precisa de entrada ordenada. Sem o sort na frente ele devolve quase o mesmo arquivo sem avisar. Não é erro, é resposta errada em silêncio.
  • Ordem e ordenação são exigências diferentes. sort -u dá ordem alfabética, awk '!seen[$0]++' dá a original. Para logs você quase sempre quer a segunda, e quase todo artigo mostra a primeira.

Related questions

Como acho as linhas em comum entre dois arquivos? comm -12 <(sort a.txt) <(sort b.txt). As duas entradas precisam estar ordenadas, e é para isso que serve a substituição de processos.

Como ignoro maiúsculas e minúsculas? sort -uf compara sem diferenciar; awk '!seen[tolower($0)]++' faz o mesmo mantendo a ordem.

E se o arquivo não couber na memória? O sort -u usa arquivos temporários em disco e engole entradas maiores que a RAM; a versão com awk pode estourar a memória no mesmo arquivo.

See also

O CliAI escolhe entre a versão que ordena e a que preserva a ordem conforme você formula a tarefa, e mostra o comando antes. Instale em uma linha.