Como classifico texto e números mistos (por exemplo, nomes de host)?

2

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

EDITAR

Eu deveria ter mencionado que, além do "seja lá o que for", também haveria

thingaroo-#.example.org
      .
      :

blargh-#.example.org
      .
      :

...etc...

Obrigado!

    
por John Hascall 11.03.2016 / 08:15

5 respostas

3

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
    
por 11.03.2016 / 21:08
2

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.

    
por 11.03.2016 / 08:40
2

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
    
por 11.03.2016 / 14:32
1

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]
    
por 11.03.2016 / 08:44
0
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
    
por 11.03.2016 / 08:46

Tags