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 requersort - 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:
sortimprime a saída ordenada sem tocar no arquivo.
sort. sort nomedoarquivo lê o arquivo linha por linha e imprime o resultado ordenado.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
sortusa 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
sortapenas 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:
sortcompara como strings por padrão; adicione-npara números.
$ 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 estão no final. Isso é um bug?sort faz comparação de texto, caractere por caractere, da esquerda para a direita.1 é menor que 2 ou 3. Por isso 100 e 1000 vão para a frente.-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
-nao 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 -uordena e remove duplicatas em um único comando.
$ sort -u fruits.txt
apple banana cherry date
apple e banana aparecem apenas uma vez cada.-u significa unico. Ele remove as linhas repetidas do resultado ordenado.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:
uniqsó remove duplicatas adjacentes, então executesortprimeiro.
4-1. Lina Tropeça: o uniq Sozinho Não Remove Nada
$ uniq fruits.txt
banana apple cherry apple banana date
apple e banana ainda estão duplicados. O comando não fez nada?uniq só remove duplicatas que estão lado a lado.apple está na linha 2 e na linha 4. O cherry fica no meio, então o uniq enxerga dois grupos separados.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
uniqsempre vai depois dosort- Use
uniqsozinho 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.
sort | uniq -c | sort -rn é o idioma padrã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 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:
-k2seleciona a coluna de ordenação; adicione-npara 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
-k2seleciona a segunda coluna como chave de ordenação- Use
-nsempre 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.
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
uniq só olha as linhas vizinhas, então o sort precisa juntá-las antes.-n. Sem ele a comparação vira texto. Isso também ficou.sort file > file. Isso apaga o conteúdo.Resumo de Hoje em 3 Linhas
- O
uniqsó remove duplicatas que estão lado a lado, então rode osortantes para juntá-las - Adicione
-nao ordenar números. Sem ele a comparação é feita como texto - O ranking de frequência é o pipeline de três estágios
sort | uniq -c | sort -rn