explicação da ordem de classificação

5

Dando muitos arquivos, sort -n me dá este resultado:

f1.txt
f10.txt
f2.txt

que não parece certo para mim. Qual é a explicação?

Posso obter isso por padrão:

f1.txt
f2.txt
f10.txt
    
por Pedro Gonzalez 03.02.2015 / 09:06

5 respostas

6

Eu recomendo usar um pouco

sort -V data.txt

-V significa "classificação de versão" e basicamente trata corretamente os caracteres alfabéticos e numéricos, de modo que, se você tiver mais arquivos, diga:

f1.txt
f10.txt
f2.txt
a1.txt
a10.txt
a2.txt

então sort -V vai te dar

a1.txt
a2.txt
a10.txt
f1.txt
f2.txt
f10.txt

considerando sort -k 1.2n ou sort -n -k 1.2 :

a1.txt
f1.txt
a2.txt
f2.txt
a10.txt
f10.txt
    
por 03.02.2015 / 09:27
4

Como suas linhas de dados não são iniciadas com um número, a -n umeric sort as trata como não-números (e assim as deixa onde estão). Assim que deixar de ser possível interpretar os dados como um número -n deixa de cuidar. Você precisa usar a opção de classificação -k eyed :

sort -k 1.2n data.txt

Isso classifica com uma tecla definida pelo primeiro campo, começando no segundo caractere, usando a comparação numérica a partir desse ponto.

    
por 03.02.2015 / 09:13
2

Classificação GNU com a opção -n usando strnumcmp () que não faz Conversões numéricas (consulte a função numcompare ()) . Esta é uma comparação puramente string.

Quando o seu campo-chave não começa com um número, o último tipo de recurso classifica o byte pelo byte, você obterá o resultado alfabético base do pedido em seu local.

Exemplo:

$ LC_ALL=en_US.utf8 sort -n test.txt
f10.txt
f1.txt
f2.txt

$ LC_ALL=C sort -n test.txt
f1.txt
f10.txt
f2.txt
    
por 03.02.2015 / 10:54
1
> sort -n -t . -k 1.2 file
f1.txt
f2.txt
f10.txt

Funciona mesmo sem o -t . .

    
por 03.02.2015 / 09:11
1

Se estiver usando zsh , você pode classificar a lista numericamente com:

printf '%s\n' *.txt(n)

Isso é semelhante ao GNU sort -v ou à ls classificação do GNU -v :

ls -vd -- *.txt

Isso classifica f2 antes de f10 , mas g1 após f2 .

Para classificar uma lista armazenada em uma matriz zsh (em oposição a arquivos no diretório atual com globbing):

files=(
  f1.txt
  f10.txt
  f2.txt
)
printf '%s\n' ${(n)files}    
    
por 03.02.2015 / 11:00