Linux / Comando sort: ordenar texto, números e campos
sort ordena linhas de texto e, normalmente, envia o resultado para a saída padrão, a saída do comando exibida no terminal. Use -n para comparar números e -k para escolher campos. A leitura e a exibição do resultado não alteram o arquivo de entrada; para salvar, escolha explicitamente um arquivo de saída.
A comparação de texto segue a localidade, ou locale, que define regras de idioma e formato numérico. Para repetir estes exemplos com a mesma ordem, usamos LC_ALL=C, que ordena pelos valores dos bytes e usa ponto decimal. Essa ordem não equivale à ordem alfabética do português, principalmente para acentos e diferenças entre maiúsculas e minúsculas.
Sintaxe e implementação
sort [opções] [arquivo...]
Os colchetes indicam partes opcionais; essa linha é uma descrição da sintaxe, não um comando para copiar literalmente. Sem arquivo, sort lê a entrada padrão, por exemplo, os dados recebidos por um pipe (|). As opções podem variar entre implementações: consulte sort --version, sort --help ou man sort no sistema que usa. As opções discutidas aqui seguem o GNU Coreutils.
Preparar arquivos e ordenar nomes
Abra uma sessão de terminal Bash dedicada ao exercício e escolha um diretório em que possa criar uma pasta. O bloco cria uma pasta nova com nome exclusivo, entra nela e grava cinco arquivos pequenos. Os comandos são encadeados com &&: se uma preparação falhar, o restante do bloco não continua. Use a mesma sessão para os exemplos seguintes.
sort_demo=$(mktemp -d ./sort-demo.XXXXXX) &&
cd "$sort_demo" &&
export LC_ALL=C &&
printf 'zebra\napple\nbanana\napple\n' > names.txt &&
printf '10\n2\n-3\n2.5\n' > scores.txt &&
printf 'Zeca 10\nAna 2\nBia 10\n' > results.txt &&
printf 'Zeca;10\nAna;2\nBia;10\n' > results-semi.txt &&
printf 'apple\napple\nbanana\napple\n' > adjacent.txt &&
sort names.txt
A última linha executa a ordenação básica de names.txt. O resultado tem quatro linhas: apple, apple, banana e zebra, nessa ordem. A repetição permanece porque ordenar não remove duplicatas por padrão. O arquivo continua com zebra na primeira linha; confira com cat names.txt.
export LC_ALL=C afeta esta sessão e os processos iniciados por ela. Ao encerrar o terminal dedicado, esse ajuste deixa de afetar seus comandos futuros. A pasta de prática e seus arquivos permanecem disponíveis; não há limpeza automática nem alteração de arquivos fora dela.
Comparar números em vez de texto
Em scores.txt, as linhas são 10, 2, -3 e 2.5. A comparação textual sort scores.txt, no ambiente C do exercício, coloca 10 antes de 2. Para considerar o valor numérico, execute:
sort -n scores.txt
A saída é -3, 2, 2.5 e 10, uma linha por valor. Para ordem numérica decrescente, use sort -nr scores.txt: o resultado começa com 10 e termina com -3. Sem -n, a opção -r apenas inverte a comparação textual.
No GNU sort -n, a comparação usa o prefixo numérico do campo; não é uma validação de que todo o conteúdo seja um número. Um campo sem prefixo numérico é tratado como zero, e notação exponencial ou sinal + inicial exigem outra forma de comparação, como -g. Confira o formato dos dados e a localidade antes de aplicar o comando a valores decimais reais.
Ordenar pelo segundo campo
O arquivo results.txt contém um nome e uma pontuação por linha. -k2,2n limita a chave ao segundo campo e aplica comparação numérica a ela. Com a separação padrão, o campo é identificado pelas transições entre caracteres em branco e os demais caracteres, normalmente espaços e tabulações; a parte em branco inicial pode pertencer à chave.
sort -k2,2n results.txt
A saída é Ana 2, Bia 10 e Zeca 10. As duas últimas linhas têm a mesma pontuação. Por padrão, o GNU sort desempata pela linha inteira, por isso Bia aparece antes de Zeca, embora tenha sido gravada depois. Para manter a ordem original entre pontuações iguais, use sort -s -k2,2n results.txt; a saída será Ana 2, Zeca 10 e Bia 10.
Em results-semi.txt, os mesmos dados usam ponto e vírgula. O comando sort -t ';' -k2,2n results-semi.txt produz Ana;2, Bia;10 e Zeca;10. -t define o separador de campos; ele não interpreta regras de aspas nem quebras de linha dentro de registros de um CSV complexo.
Para usar várias chaves, informe cada uma separadamente: sort -k2,2n -k1,1 results.txt usa a pontuação e depois o nome. Especificar início e fim evita que uma chave textual avance até o restante da linha sem intenção. Se espaços iniciais afetarem uma chave textual, confira também a opção -b.
Receber linhas pela entrada padrão
Este exemplo preserva os três valores enviados pelo printf e ordena a saída sem criar arquivos:
printf 'zebra\napple\nbanana\n' | sort
Saída esperada para os valores do exemplo:
apple
banana
zebra
Opções principais
| Opção ou formato | Uso |
|---|---|
-n |
Compara o prefixo numérico. |
-r |
Inverte a ordem da comparação. |
-k início,fim |
Delimita a chave por campos, numerados a partir de 1. |
-u |
Mantém uma linha por grupo de chaves consideradas iguais. |
-t separador |
Define o caractere separador de campos. |
-s |
Preserva a ordem relativa de linhas com chaves iguais. |
-o arquivo |
Grava o resultado no arquivo indicado. |
Duplicatas e gravação do resultado
sort -u names.txt retorna apple, banana e zebra. Já sort -u -k2,2n results.txt reduz as duas pontuações 10 a uma linha e, neste exemplo, retorna Ana 2 e Zeca 10. Como Bia tem a mesma chave numérica, seu registro desaparece, mesmo com um nome diferente. Não use essa opção para descartar registros sem decidir antes o que constitui uma duplicata.
O comando uniq, explicado neste guia em inglês compara linhas vizinhas. No arquivo de prática, uniq adjacent.txt retorna apple, banana e apple: a última ocorrência continua porque não estava junto das primeiras. Se você ordenar antes, muda a ordem original dos registros.
Para gravar uma nova saída do exercício sem sobrescrever uma existente, execute (set -C; sort names.txt > names-sorted.txt). Depois de sucesso, confira com cat names-sorted.txt. O parêntese limita o ajuste set -C ao comando; se o arquivo de saída já existir, escolha outro nome. Não execute sort names.txt > names.txt: o shell pode esvaziar o arquivo antes de o sort lê-lo.
Pergunta frequente
Como salvar o resultado no próprio arquivo de entrada?
No modo normal de ordenação do GNU sort, sort -o names.txt names.txt permite usar o mesmo arquivo como entrada e saída. Antes de fazê-lo em dados importantes, preserve uma cópia independente e confira o resultado depois. Esse procedimento altera o arquivo: não oferece proteção contra falhas de energia ou de entrada e saída. Para os primeiros testes, prefira um nome de saída novo e mantenha o original.
Documentação oficial
A documentação do GNU sort sobre chaves, localidade e arquivos de saída detalha as condições de cada opção. Compare-a com a ajuda da implementação instalada antes de usar as mesmas opções em outro sistema.




