De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.

Como controlar com precisão as chaves de ordenação com "sort"

Colaboração: Rubens Queiroz de Almeida

Data de Publicação: 27 de agosto de 2026

O comando sort é frequentemente utilizado de uma forma muito simples:

$ sort arquivo.txt

Nesse caso, ele compara as linhas inteiras e as coloca em ordem alfabética. Entretanto, arquivos de dados normalmente possuem várias colunas, e nem sempre queremos considerar todo o conteúdo da linha. Podemos precisar ordenar uma lista pelo nome, pelo salário, por uma data ou até mesmo por apenas alguns caracteres de determinado campo.

Para controlar exatamente qual parte da linha será usada na comparação, utilizamos a opção -k.

A estrutura de uma chave de ordenação

A sintaxe básica é:

 -k INÍCIO,FIM

O início e o fim indicam os campos que formarão a chave de ordenação.

Considere o arquivo funcionarios.txt:

1003 Carlos Vendas
1001 Ana Suporte
1004 Daniel Vendas
1002 Beatriz Financeiro

Para ordenar pelo primeiro campo, que contém o código, usamos:

$ sort -k1,1 funcionarios.txt 

Resultado:

1001 Ana Suporte
1002 Beatriz Financeiro
1003 Carlos Vendas
1004 Daniel Vendas

Para ordenar pelo segundo campo, que contém o nome:

$ sort -k2,2 funcionarios.txt 

Resultado:

1001 Ana Suporte
1002 Beatriz Financeiro
1003 Carlos Vendas
1004 Daniel Vendas

A expressão:

 -k2,2 

informa que a chave começa no segundo campo e também termina no segundo campo. Portanto, somente o nome participa da comparação principal.

A diferença entre "-k2" e "-k2,2"

Uma das causas mais comuns de resultados inesperados é acreditar que estas duas opções são equivalentes:

$ sort -k2 arquivo.txt 
$ sort -k2,2 arquivo.txt 

Elas possuem significados diferentes.

A primeira:

 -k2 

usa como chave todo o conteúdo existente desde o início do segundo campo até o final da linha.

A segunda:

-k2,2 

limita a chave exclusivamente ao segundo campo.

Considere:

001 Ana Vendas
002 Ana Financeiro
003 Carlos Suporte
004 Ana Administração

O comando:

$ sort -k2 arquivo.txt 

não compara apenas os nomes. Para as três linhas que contêm Ana, ele também considera o departamento, pois a chave continua até o final da linha.

Resultado:

004 Ana Administração
002 Ana Financeiro
001 Ana Vendas
003 Carlos Suporte

Se o objetivo for usar somente o nome, o comando correto é:

$ sort -k2,2 arquivo.txt 

Quando os nomes forem iguais, o GNU sort ainda poderá usar a linha completa como critério final de desempate. Para preservar a ordem original das linhas que possuem nomes iguais, acrescente a opção -s:

$ sort -s -k2,2 arquivo.txt 

Resultado:

001 Ana Vendas
002 Ana Financeiro
004 Ana Administração
003 Carlos Suporte

Arquivos com delimitadores definidos

Por padrão, o sort reconhece campos separados por espaços em branco. Para trabalhar com outro separador, usamos -t.

Considere o arquivo salarios.txt:

1003;Carlos;5200
1001;Ana;6100
1004;Daniel;4800
1002;Beatriz;7300

Para indicar que os campos estão separados por ponto e vírgula:

$ sort -t';' -k2,2 salarios.txt 

Nesse comando:

  • -t';' define o ponto e vírgula como separador;
  • -k2,2 limita a chave ao segundo campo.

Para ordenar numericamente pelo salário:

$ sort -t';' -k3,3n salarios.txt 

Resultado:

1004;Daniel;4800
1003;Carlos;5200
1001;Ana;6100
1002;Beatriz;7300

O modificador n, colocado no final da chave, determina uma comparação numérica:

 -k3,3n 

Sem ele, os valores seriam tratados como texto.

Para mostrar os maiores salários primeiro, acrescente r, de ordem inversa:

$ sort -t';' -k3,3nr salarios.txt 

Selecionando caracteres dentro de um campo

Uma chave também pode começar ou terminar em uma posição específica do campo. A sintaxe é:

CAMPO.CARACTERE 

Considere o arquivo produtos.txt:

BR-SP-1045 Monitor
BR-RJ-1008 Teclado
BR-SP-1012 Mouse
BR-MG-1031 Impressora

O código da unidade federativa ocupa o quarto e o quinto caracteres do primeiro campo. Podemos ordenar por essa parte usando:

$ sort -k1.4,1.5 produtos.txt 

Resultado:

BR-MG-1031 Impressora
BR-RJ-1008 Teclado
BR-SP-1045 Monitor
BR-SP-1012 Mouse

A chave:

 -k1.4,1.5 

começa no quarto caractere do primeiro campo e termina no quinto caractere desse mesmo campo.

Também podemos selecionar a parte numérica do código, que começa no sétimo caractere:

$ sort -k1.7,1.10n produtos.txt 

Resultado:

BR-RJ-1008 Teclado
BR-SP-1012 Mouse
BR-MG-1031 Impressora
BR-SP-1045 Monitor

O modificador n é importante porque informa que essa parte deve ser comparada numericamente.

Ordenando datas no formato brasileiro

A seleção de caracteres pode ser usada para ordenar datas no formato DD/MM/AAAA.

Considere:

Ana;31/12/2025
Carlos;05/01/2024
Beatriz;17/08/2025
Daniel;03/02/2025

Uma ordenação textual pelo segundo campo não funciona, pois começaria pelo dia. Para produzir uma ordem cronológica, usamos primeiro o ano, depois o mês e finalmente o dia:

$ sort -t';' \
    -k2.7,2.10n \
    -k2.4,2.5n \
    -k2.1,2.2n \
    arquivo.txt

Resultado:

Carlos;05/01/2024
Daniel;03/02/2025
Beatriz;17/08/2025
Ana;31/12/2025

Nesse exemplo, cada parte da data funciona como uma chave independente.

Conferindo as chaves com "--debug"

Quando o resultado não for o esperado, o GNU sort oferece a opção --debug:

$ sort --debug -k2,2 arquivo.txt 

Ela mostra quais partes das linhas estão sendo interpretadas como chaves. Para uma chave numérica:

$ sort --debug -t';' -k3,3n salarios.txt 

O comando sublinha os trechos usados na comparação e pode emitir avisos sobre chaves mal delimitadas, números não reconhecidos ou influência da localidade.

Como o resultado contém marcações de diagnóstico, --debug deve ser usado apenas durante os testes.

Conclusão

O segredo para controlar o sort está em delimitar corretamente suas chaves. Sempre que o objetivo for ordenar por apenas um campo, prefira uma expressão explícita:

$ sort -k2,2 arquivo.txt 

em vez de:

$ sort -k2 arquivo.txt 

A primeira utiliza somente o segundo campo. A segunda começa no segundo campo e continua até o fim da linha.

Quando for necessário trabalhar com colunas delimitadas, partes de campos ou valores numéricos, podemos combinar -t, posições de caracteres e modificadores:

$ sort -t';' -k3,3nr arquivo.txt 

Uma chave cuidadosamente definida torna o resultado mais previsível e evita que informações indesejadas participem da comparação. Esse pequeno cuidado faz uma grande diferença ao usar o sort em scripts, relatórios, arquivos de configuração e conjuntos de dados estruturados.



Veja a relação completa dos artigos de Rubens Queiroz de Almeida