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.