Primeiros Passos com sort e uniq: Ordenando Dados e Removendo Duplicatas

Primeiros Passos com sort e uniq: Ordenando Dados e Removendo Duplicatas

O que você vai conseguir fazer

  • Ordenar linhas em ordem alfabética, numérica e reversa com `sort`
  • Explicar por que `uniq` precisa de `sort` antes dele
  • Montar um ranking de frequência com `sort | uniq -c | sort -rn`

Pré-requisitos (leia estes primeiro)

O Que Você Vai Aprender

  • Como ordenar linhas com sort (alfabética, numérica, reversa)
  • Como remover linhas duplicadas com uniq -- e por que ele implicitamente requer sort
  • Como escrever o clássico pipeline de ranking de frequência sort | uniq -c | sort -rn
  • Por que iniciantes ficam travados no "uniq não remove duplicatas" e "números saem em ordem estranha"

As palavras usadas aqui (para não confundir depois)

  • Linha: uma linha dentro do arquivo. É tudo o que fica entre uma quebra de linha e a próxima.
  • Campo: cada parte de uma linha depois de separar pelos espaços. "Coluna" quer dizer o mesmo. Aqui usamos "coluna".
  • Ordem alfabética: comparar o texto letra por letra, da esquerda para a direita. "Ordem de dicionário" é a mesma coisa.
  • Ordem numérica: comparar as linhas como números. O resultado é diferente da ordem alfabética. Essa diferença é a primeira armadilha.
  • Duplicata: duas ou mais linhas com conteúdo exatamente igual.
  • Pipe: o símbolo |. Ele entrega a saída de um comando direto para o próximo.
  • Redirecionamento: o símbolo >. Ele escreve a saída em um arquivo em vez da tela. Não funciona como o "salvar por cima" de um editor, e a seção 7-3 explica o porquê.

Resumo Rápido

  • Quer ordenar? --> sort
  • Quer ordenar e deduplicar? --> sort -u
  • Quer contar ocorrências? --> sort | uniq -c | sort -rn

Ambiente

  • SO: Ubuntu / Linux típico
  • GNU coreutils sort / uniq (versões BSD no macOS diferem em alguns detalhes de opções)
  • A ordem de classificação depende da sua locale, a configuração de idioma e região. As saídas aqui são as de LC_ALL=C, que compara os caracteres pelo código deles

1. O Que Significa "Ordenar Linhas"?

Conclusão: sort imprime a saída ordenada sem tocar no arquivo.

Lina: Senpai, frequentemente quero colocar logs ou listas em ordem alfabética. Como faço isso?
Veterano Linny: É exatamente para isso que serve o sort. sort nomedoarquivo lê o arquivo linha por linha e imprime o resultado ordenado.
Veterano Linny: O ponto importante é que ele não reescreve nada. Ele só imprime na tela. Por isso um erro de digitação não estraga o arquivo original.
Lina: Então o arquivo original fica intocado. Isso é tranquilizador.
Veterano Linny: Exato. Há três ordens de classificação para lembrar: alfabética, numérica e reversa. Saber essas três resolve 80% dos casos do mundo real.

Vamos preparar um arquivo de exemplo:

$ cat fruits.txt
banana
apple
cherry
apple
banana
date

1-1. Básico: Ordem Alfabética

$ sort fruits.txt
apple
apple
banana
banana
cherry
date

Pontos-chave

  • sort usa por padrão a ordem alfabética (dicionário)
  • Maiúsculas e minúsculas são tratadas como letras diferentes. Qual vem primeiro depende da sua locale
  • O arquivo original não é modificado. O sort apenas imprime o resultado

1-2. Ordem Reversa (Decrescente): -r

$ sort -r fruits.txt
date
cherry
banana
banana
apple
apple

-r significa reverso.

2. A Armadilha da Ordenação Numérica

Conclusão: sort compara como strings por padrão; adicione -n para números.

Lina: Ordenei alguns números, mas a ordem parece errada...
Veterano Linny: Exemplo perfeito. Vamos ver o que acontece.
$ cat scores.txt
100
3
25
9
1000
$ sort scores.txt
100
1000
25
3
9
Lina: Espera -- 100 vem antes de 25, e 3 e 9 estão no final. Isso é um bug?
Veterano Linny: Não é um bug. Por padrão, o sort faz comparação de texto, caractere por caractere, da esquerda para a direita.
Veterano Linny: Olhando só o primeiro caractere, 1 é menor que 2 ou 3. Por isso 100 e 1000 vão para a frente.
Lina: Ah, então ele nunca tratou aquilo como número. Isso me surpreendeu.
Veterano Linny: Para ordenar como números, adicione -n. Essa única opção resolve.

2-1. Ordenação Numérica: -n

$ sort -n scores.txt
3
9
25
100
1000

-n significa numerico.

Armadilha de iniciante

  • Esquecer o -n ao ordenar tamanhos ou contagens produz a ordem errada
  • Regra prática: se a coluna guarda números, adicione -n

2-2. Números em Ordem Decrescente

$ sort -nr scores.txt
1000
100
25
9
3

-n e -r combinam livremente. Esta combinação aparece em praticamente toda tarefa de ranking.

3. Ordenar + Deduplicar de Uma Vez: sort -u

Conclusão: sort -u ordena e remove duplicatas em um único comando.

$ sort -u fruits.txt
apple
banana
cherry
date
Lina: Agora apple e banana aparecem apenas uma vez cada.
Veterano Linny: Sim. -u significa unico. Ele remove as linhas repetidas do resultado ordenado.
Veterano Linny: Quando você só quer os valores únicos em ordem, esta única opção faz tudo.

No trabalho real, "me dê os valores únicos" é um dos pedidos mais comuns. sort -u é o atalho.

4. uniq: O Especialista em Deduplicação

Conclusão: uniq só remove duplicatas adjacentes, então execute sort primeiro.

4-1. Lina Tropeça: o uniq Sozinho Não Remove Nada

$ uniq fruits.txt
banana
apple
cherry
apple
banana
date
Lina: Ué, apple e banana ainda estão duplicados. O comando não fez nada?
Veterano Linny: Ele rodou sim. Mas o uniq só remove duplicatas que estão lado a lado.
Lina: Então o resultado muda conforme a posição das linhas?
Veterano Linny: Exato. Aqui o apple está na linha 2 e na linha 4. O cherry fica no meio, então o uniq enxerga dois grupos separados.
Lina: Entendi, duplicatas distantes nunca são percebidas. Agora fez sentido. E o que eu faço?
Veterano Linny: Rode o sort antes. Quando o sort coloca as linhas idênticas lado a lado, o uniq consegue juntá-las direito.

Por que o sort precisa vir primeiro

O uniq lê uma linha por vez e compara apenas com a linha imediatamente anterior. Ele nunca guarda o arquivo inteiro na memória.

Por isso linhas iguais que estão distantes sobrevivem as duas. O sort junta as linhas iguais. É isso que permite ao uniq fazer o trabalho dele.

4-2. O Padrão sort | uniq

$ sort fruits.txt | uniq
apple
banana
cherry
date

Regra prática

  • uniq sempre vai depois do sort
  • Use uniq sozinho apenas quando você já sabe que a entrada está ordenada
  • Se "ordenar e deduplicar" é tudo que você quer, sort -u é mais curto

4-3. Contando Ocorrências: uniq -c

$ sort fruits.txt | uniq -c
      2 apple
      2 banana
      1 cherry
      1 date

-c significa contagem. Cada linha recebe a sua contagem de ocorrências na frente. Isso é muito útil para agregação.

4-4. Apenas Duplicados / Apenas Únicos

# Mostrar apenas linhas que aparecem mais de uma vez
$ sort fruits.txt | uniq -d
apple
banana
# Mostrar apenas linhas que aparecem exatamente uma vez
$ sort fruits.txt | uniq -u
cherry
date
Opção Significado Caso de uso
-c Prefixar contagem Agregação
-d Apenas duplicados Encontrar itens duplicados
-u Apenas únicos Extrair valores vistos exatamente 1x
-i Comparação sem diferenciar caso Mesclar variantes de maiúsculas/minúsculas

Tanto o sort quanto o uniq têm uma opção -u, e o sentido é diferente. O sort -u junta as duplicatas em uma linha só. O uniq -u guarda apenas as linhas que aparecem exatamente uma vez. Não troque uma pela outra.

5. O Carro-Chefe do Mundo Real: Ranking de Frequência

Conclusão: sort | uniq -c | sort -rn é o idioma de ranking de frequência.

Lina: Para logs de acesso, quero saber qual IP acessa mais o servidor. Como faço isso?
Veterano Linny: Este é o clímax de hoje. O pipeline de três estágios sort | uniq -c | sort -rn é o idioma padrão.
Veterano Linny: Pode decorar esse formato. Logo a seguir vamos separá-lo estágio por estágio.

Log de exemplo:

$ cat access.log
192.168.1.10
192.168.1.20
192.168.1.10
192.168.1.30
192.168.1.10
192.168.1.20

Ranking de frequência:

$ sort access.log | uniq -c | sort -rn
      3 192.168.1.10
      2 192.168.1.20
      1 192.168.1.30

Detalhamento do pipeline

Estágio Comando O que faz
1 sort Coloca linhas idênticas uma ao lado da outra
2 uniq -c Colapsa duplicatas adjacentes com contagem
3 sort -rn Ordena por contagem (numérico) em ordem decrescente

Tire o primeiro sort e o estágio 2 conta errado. Ele trataria linhas iguais e distantes como grupos separados.

O estágio 3 ordena de novo porque o alvo mudou. Até o estágio 2 a ordem vinha do texto da linha. No estágio 3 a ordem vem da contagem que o estágio 2 acabou de acrescentar.

5-1. Apenas Top N

$ sort access.log | uniq -c | sort -rn | head -n 3

head -n 3 mantém as top 3 entradas. Combinar com head é o padrão cotidiano.

6. Avançado: Ordenar por uma Coluna Específica com -k

Conclusão: -k2 seleciona a coluna de ordenação; adicione -n para campos numéricos.

Para dados CSV ou separados por espaços, use o -k. Ele escolhe por qual coluna ordenar.

$ cat sales.txt
apple 120
banana 80
cherry 200
date 50
# Ordenar pela 2a coluna (numerico) em ordem decrescente
$ sort -k2 -nr sales.txt
cherry 200
apple 120
banana 80
date 50
  • -k2 seleciona a segunda coluna como chave de ordenação
  • Use -n sempre que essa coluna guardar números
  • Para mudar o delimitador, use -t, (separado por vírgula) ou -t:

7. Armadilhas Comuns de Iniciantes

Conclusão: Duplicatas persistem sem sort; números precisam de -n.

7-1. uniq Não Removeu as Duplicatas

Causa: esqueceu de fazer sort primeiro.

# RUIM: duplicatas nao adjacentes nao sao removidas
$ uniq fruits.txt

# BOM
$ sort fruits.txt | uniq
$ sort -u fruits.txt

7-2. Números Sairam em Ordem Estranha

Causa: esqueceu -n. sort está fazendo comparação de strings.

$ sort -n scores.txt   # Ordenar como numeros

7-3. O Arquivo Original Não Foi Modificado

O sort apenas imprime na tela. Ele nunca modifica o arquivo de entrada. Para salvar o resultado ordenado, redirecione você mesmo.

$ sort fruits.txt > fruits-sorted.txt

Nunca faça isso

# RUIM: isso esvazia o arquivo
$ sort fruits.txt > fruits.txt

O > esvazia o arquivo de destino antes de o comando rodar. Então o sort lê um arquivo vazio. Não é assim que funciona o "salvar por cima" de um editor gráfico.

Para gravar no mesmo arquivo com segurança, ordene para um segundo arquivo e troque depois. Ou use o sort -o.

# BOM: -o escreve apenas apos a leitura terminar
$ sort -o fruits.txt fruits.txt

O terminalUm programa interativo que interpreta os comandos digitados e os executa. virtual deste site é para aprender. Nada aqui danifica os arquivos do seu computador, então pode testar à vontade.

7-4. Maiúsculas/Minúsculas São Tratadas Como Diferentes

$ cat names.txt
Alice
bob
Alice
BOB
$ LC_ALL=C sort -u names.txt
Alice
BOB
bob

O LC_ALL=C está ali para a sua ordem bater com a do artigo. Sem ele, algumas locales colocam bob antes de BOB.

Para ignorar maiúsculas e minúsculas, adicione -f (fold case).

$ LC_ALL=C sort -uf names.txt
Alice
bob

8. Mini Exercícios

Conclusão: Três exercícios: deduplicar, contar e classificar em ordem decrescente.

Lina: Entendi a teoria! Quero experimentar de verdade.
Veterano Linny: Aqui estão três exercícios. Execute-os no seu terminal.

Exercício 1: Imprima as palavras únicas deste arquivo.

$ cat << 'EOF' > words.txt
apple
banana
apple
cherry
banana
EOF
Ver dica 1 (direcionamento)

Uma única opção faz "ordenar" e "remover duplicatas" de uma vez só. Volte na seção 3.

Ver dica 2 (nome do comando)

O comando é o sort. Uma das opções dele ordena e remove duplicatas de uma vez só. Procure com sort --help.

Ver a resposta
$ sort -u words.txt
apple
banana
cherry

Exercício 2: Conte quantas vezes cada palavra aparece.

Ver dica 1 (direcionamento)

Antes de contar, as palavras iguais precisam ficar lado a lado. Por isso o pipe tem dois estágios.

Ver dica 2 (nome do comando)

Os comandos são sort e uniq. O uniq tem uma opção que conta ocorrências.

Ver a resposta
$ sort words.txt | uniq -c
      2 apple
      2 banana
      1 cherry

Exercício 3: Ordene as contagens em ordem decrescente e mostre apenas os 2 primeiros.

Ver dica 1 (direcionamento)

A coluna de contagem guarda números. Reordene por esse número, do maior para o menor. Depois pegue só as duas primeiras linhas.

Ver dica 2 (nome do comando)

Os comandos são sort e head. O sort tem uma opção para tratar valores como números e outra para inverter a ordem.

Ver a resposta
$ sort words.txt | uniq -c | sort -rn | head -n 2
      2 banana
      2 apple

apple e banana aparecem duas vezes cada. Quando a contagem empata, a linha inteira decide a ordem. O -r também inverte essa comparação, então banana fica em primeiro.

9. Templates para Copiar e Colar

Conclusão: Mantenha os padrões de ordenação, deduplicação e ranking por perto.

Padrões para ter à mão

# Ordenar alfabeticamente
sort file.txt

# Ordenar e deduplicar
sort -u file.txt

# Ordenar numericamente (crescente / decrescente)
sort -n file.txt
sort -nr file.txt

# Contar ocorrencias por linha
sort file.txt | uniq -c

# Ranking de frequencia (mais frequente primeiro)
sort file.txt | uniq -c | sort -rn

# Top 10 ranking de frequencia
sort file.txt | uniq -c | sort -rn | head -n 10

# Ordenar pela 2a coluna, numerico decrescente
sort -k2 -nr file.txt

# Valores unicos sem diferenciar maiusculas/minusculas
sort -uf file.txt

# Ordenar in-place com seguranca (evita o bug de auto-truncamento com >)
sort -o file.txt file.txt

10. Revisão

Lina: Vou resumir. O uniq só olha as linhas vizinhas, então o sort precisa juntá-las antes.
Veterano Linny: Exato. Essa ordem vale a pena guardar junto com o motivo.
Lina: E números pedem -n. Sem ele a comparação vira texto. Isso também ficou.
Veterano Linny: Perfeito. Uma última coisa: nunca rode sort file > file. Isso apaga o conteúdo.

Resumo de Hoje em 3 Linhas

  1. O uniq só remove duplicatas que estão lado a lado, então rode o sort antes para juntá-las
  2. Adicione -n ao ordenar números. Sem ele a comparação é feita como texto
  3. O ranking de frequência é o pipeline de três estágios sort | uniq -c | sort -rn

Resumo: O Que Ler em Seguida