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 requersort - 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:
sortimprime a saida ordenada sem tocar no arquivo.
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.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
sortusa por padrao a ordem alfabetica (dicionario)- Maiusculas e minusculas sao tipicamente tratadas como diferentes (maiusculas vem primeiro)
- O arquivo original nao e modificado --
sortapenas 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:
sortcompara como strings por padrao; adicione-npara numeros.
$ cat scores.txt
100 3 25 9 1000
$ sort scores.txt
100 1000 25 3 9
100 vem antes de 25, e 3 e 9 estao no final. Isso e um bug?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
-nao 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 -uordena e remove duplicatas em um unico comando.
$ sort -u fruits.txt
apple banana cherry date
apple e banana aparecem apenas uma vez cada.-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:
uniqso remove duplicatas adjacentes, entao executesortprimeiro.
4-1. Basico
$ uniq fruits.txt
banana apple cherry apple banana date
apple e banana ainda estao duplicados!uniq. Ele so remove duplicatas adjacentes -- duplicatas separadas por outras linhas sao mantidas.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
uniqsempre vai depois dosort- Use
uniqsozinho apenas quando voce ja sabe que a entrada esta ordenada - Se "ordenar e deduplicar" e tudo que voce quer,
sort -ue 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 -rne o idioma de ranking de frequencia.
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:
-k2seleciona a coluna de ordenacao; adicione-npara 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
-k2seleciona o segundo campo como chave de ordenacao- Use
-nsempre 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.
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