Se você tiver o GNU coreutils ≥ 7.0, poderá usar a classificação de versão. Esta é a ordem lexicográfica, exceto que as seqüências de dígitos são ordenadas de acordo com seu valor como um inteiro em notação decimal.
sort -V
Considerando a entrada com texto e números mistos (sem zeros à esquerda) , como posso classificá-lo na ordem "natural"? Por exemplo, dada a seguinte entrada (hostnames):
whatever-1.example.org
whatever-10.example.org
whatever-11.example.org
whatever-12.example.org
whatever-13.example.org
whatever-2.example.org
whatever-3.example.org
whatever-4.example.org
whatever-5.example.org
whatever-6.example.org
whatever-7.example.org
whatever-8.example.org
whatever-9.example.org
Eu gostaria dessa saída:
whatever-1.example.org
whatever-2.example.org
whatever-3.example.org
whatever-4.example.org
whatever-5.example.org
whatever-6.example.org
whatever-7.example.org
whatever-8.example.org
whatever-9.example.org
whatever-10.example.org
whatever-11.example.org
whatever-12.example.org
whatever-13.example.org
Eu deveria ter mencionado que, além do "seja lá o que for", também haveria
thingaroo-#.example.org
.
:
blargh-#.example.org
.
:
...etc...
Obrigado!
Esse estilo específico de entrada pode ser classificado com êxito com
sort -t - -nk2,2
mas realmente não generaliza para todos os tipos de nomes de arquivos, se é isso o que você está procurando.
Desculpe, não forneci todas as informações necessárias na minha pergunta original. Todas as respostas foram úteis para mim com o que eu realmente queria. O que acabei usando foi:
sort -t- -k1,1 -k2,2
onde:
-t- divide the hostnames into fields using dash (-) rather than spaces
-k1,1 the first sort key is the first field (from 1 to 1), a normal sort
-k2,2 the second key is the second field using a numeric (n) sort
(the field includes the ".example.org" but the numeric sort
seems to cope find with the trailing non-number chars)
isso dá o resultado:
blargh-1.example.org
:
blargh-13.example.org
thingaroo-1.example.org
:
thingaroo-17.example.org
whatever-1.example.org
:
whatever-13.example.org
Assumindo que qualquer que seja em seu texto pode variar, você precisa usar sort
com as seguintes opções:
-t, --field-separator=SEP use SEP instead of non-blank to blank transition
k, --key=POS1[,POS2] start a key at POS1 (origin 1), end it at POS2 (default end of line)
-V, --version-sort natural sort of (version) numbers within text
sort -t "-" -k 2 -V < [filename]
sort -t- -k2n file
whatever-1.example.org
whatever-2.example.org
whatever-3.example.org
whatever-4.example.org
whatever-5.example.org
whatever-6.example.org
whatever-7.example.org
whatever-8.example.org
whatever-9.example.org
whatever-10.example.org
whatever-11.example.org
whatever-12.example.org
whatever-13.example.org
Tags sort