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

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

O Que Voce Vai Aprender

  • Como ordenar linhas com sort (alfabetica, numerica, reversa)
  • Como remover linhas duplicadas com uniq -- e por que ele implicitamente requer sort
  • Como escrever o classico pipeline de ranking de frequencia sort | uniq -c | sort -rn
  • Por que iniciantes ficam travados no "uniq nao remove duplicatas" e "numeros saem em ordem estranha"

Resumo Rapido

  • Quer ordenar? --> sort
  • Quer ordenar e deduplicar? --> sort -u
  • Quer contar ocorrencias? --> sort | uniq -c | sort -rn

Ambiente

  • SO: Ubuntu / Linux tipico
  • GNU coreutils sort / uniq (versoes BSD no macOS diferem em alguns detalhes de opcoes)

1. O Que Significa "Ordenar Linhas"?

Conclusao: sort imprime a saida ordenada sem tocar no arquivo.

Lina: Senpai, frequentemente quero colocar logs ou listas em ordem alfabetica. Como faco isso?
Veterano Linny: E exatamente para isso que serve o sort. sort nomedoarquivo le o arquivo linha por linha e imprime o resultado ordenado. Ele nao modifica o arquivo -- apenas imprime na tela, entao voce pode experimentar com seguranca.
Lina: Entao o arquivo original fica intocado. Isso e tranquilizador.
Veterano Linny: Exato. Ha tres ordens de classificacao para lembrar: alfabetica, numerica e reversa. Saber essas tres resolve 80% dos casos do mundo real.

Vamos preparar um arquivo de exemplo:

$ cat fruits.txt
banana
apple
cherry
apple
banana
date

1-1. Basico: Ordem Alfabetica

$ sort fruits.txt
apple
apple
banana
banana
cherry
date

Pontos-chave

  • sort usa por padrao a ordem alfabetica (dicionario)
  • Maiusculas e minusculas sao tipicamente tratadas como diferentes (maiusculas vem primeiro)
  • O arquivo original nao e modificado -- sort apenas imprime na tela

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

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

-r significa reverso.

2. A Armadilha da Ordenacao Numerica

Conclusao: sort compara como strings por padrao; adicione -n para numeros.

Lina: Ordenei alguns numeros, 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 estao no final. Isso e um bug?
Veterano Linny: Nao e um bug. Por padrao, sort faz comparacao de strings caractere por caractere da esquerda, entao linhas comecando com 1 vem antes de linhas comecando com 2 ou 3. Para ordenar como numeros, passe -n.

2-1. Ordenacao Numerica: -n

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

-n significa numerico.

Armadilha de iniciante

  • Esquecer -n ao ordenar tamanhos, contagens ou qualquer coluna numerica produz a ordem errada
  • Regra pratica: "se a coluna parece um numero, adicione -n"

2-2. Numeros em Ordem Decrescente

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

-n e -r combinam livremente. Esta combinacao aparece em praticamente toda tarefa de ranking.

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

Conclusao: sort -u ordena e remove duplicatas em um unico 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 ordena e remove duplicatas em um unico comando. Quando voce so quer "os valores unicos, ordenados," esta unica opcao faz tudo.

No trabalho real, "me de os valores unicos" e um dos pedidos mais comuns. sort -u e o atalho.

4. uniq: O Especialista em Deduplicacao

Conclusao: uniq so remove duplicatas adjacentes, entao execute sort primeiro.

4-1. Basico

$ uniq fruits.txt
banana
apple
cherry
apple
banana
date
Lina: Ue, apple e banana ainda estao duplicados!
Veterano Linny: Essa e a maior pegadinha do uniq. Ele so remove duplicatas adjacentes -- duplicatas separadas por outras linhas sao mantidas.
Lina: Entao como eu realmente removo todas as duplicatas?
Veterano Linny: Passe pelo sort primeiro. Uma vez que o sort coloca linhas identicas uma ao lado da outra, o uniq consegue colapse-las corretamente.

4-2. O Padrao sort | uniq

$ sort fruits.txt | uniq
apple
banana
cherry
date

Regra pratica

  • uniq sempre vai depois do sort
  • Use uniq sozinho apenas quando voce ja sabe que a entrada esta ordenada
  • Se "ordenar e deduplicar" e tudo que voce quer, sort -u e mais curto

4-3. Contando Ocorrencias: uniq -c

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

-c significa contagem -- cada linha recebe sua contagem de ocorrencias como prefixo. Extremamente util para agregacao.

4-4. Apenas Duplicados / Apenas Unicos

# 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
Opcao Significado Caso de uso
-c Prefixar contagem Agregacao
-d Apenas duplicados Encontrar itens duplicados
-u Apenas unicos Extrair valores vistos exatamente 1x
-i Comparacao sem diferenciar caso Mesclar variantes de maiusculas/minusculas

5. O Carro-Chefe do Mundo Real: Ranking de Frequencia

Conclusao: sort | uniq -c | sort -rn e o idioma de ranking de frequencia.

Lina: Para logs de acesso, quero saber qual IP acessa mais o servidor. Como faco isso?
Veterano Linny: Este e o climax de hoje. O pipeline de tres estagios sort | uniq -c | sort -rn e o idioma padrao. Memorize-o.

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 frequencia:

$ 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

Estagio Comando O que faz
1 sort Coloca linhas identicas uma ao lado da outra
2 uniq -c Colapsa duplicatas adjacentes com contagem
3 sort -rn Ordena por contagem (numerico) em ordem decrescente

5-1. Apenas Top N

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

head -n 3 mantem as top 3 entradas. Combinar com head e o padrao cotidiano.

6. Avancado: Ordenar por uma Coluna Especifica com -k

Conclusao: -k2 seleciona a coluna de ordenacao; adicione -n para campos numericos.

Para dados CSV ou separados por espacos, -k escolhe por qual campo 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 o segundo campo como chave de ordenacao
  • Use -n sempre que a coluna escolhida for numerica
  • Para mudar o delimitador, use -t, (separado por virgula), -t:, etc.

7. Armadilhas Comuns de Iniciantes

Conclusao: Duplicatas persistem sem sort; numeros precisam de -n.

7-1. uniq Nao 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. Numeros Sairam em Ordem Estranha

Causa: esqueceu -n. sort esta fazendo comparacao de strings.

$ sort -n scores.txt   # Ordenar como numeros

7-3. O Arquivo Original Nao Foi Modificado

sort apenas imprime na tela -- nunca modifica o arquivo de entrada. Para salvar o resultado ordenado, redirecione explicitamente:

$ sort fruits.txt > fruits-sorted.txt

Nunca faca isso

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

> trunca o destino antes do comando executar, entao sort le um arquivo vazio. Para ordenar in-place com seguranca, use sort -o:

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

7-4. Maiusculas/Minusculas Sao Tratadas Como Diferentes

$ cat names.txt
Alice
bob
Alice
BOB
$ sort -u names.txt
Alice
BOB
bob

Para ignorar maiusculas/minusculas, adicione -f (fold case):

$ sort -uf names.txt
Alice
bob

8. Mini Exercicios

Conclusao: Tres exercicios: deduplicar, contar e classificar em ordem decrescente.

Lina: Entendi a teoria! Quero experimentar de verdade.
Veterano Linny: Aqui estao tres exercicios. Execute-os no seu terminal.

Exercicio 1: Imprima as palavras unicas deste arquivo.

$ cat << 'EOF' > words.txt
apple
banana
apple
cherry
banana
EOF
Mostrar dica

Ha uma opcao que faz "ordenar e deduplicar" em um unico passo.

Mostrar resposta
$ sort -u words.txt
apple
banana
cherry

Exercicio 2: Conte quantas vezes cada palavra aparece.

Mostrar dica

Pipe de dois estagios: sort --> uniq -c.

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

Exercicio 3: Ordene as contagens em ordem decrescente e mostre apenas os 2 primeiros.

Mostrar dica

Ordene a coluna de contagem numericamente em reverso --> mantenha 2 linhas com head.

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

9. Templates para Copiar e Colar

Conclusao: Mantenha os padroes de ordenacao, deduplicacao e ranking por perto.

Padroes para ter a mao

# 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

Resumo: O Que Ler em Seguida