Por que o registro não numérico é exibido após “0” na classificação?

8

Eu quero classificar os arquivos de acordo com o número no nome do arquivo. Aqui estão os arquivos:

$ ls *.f
0.f  13.f  1.f  22.f  4.f  abc.f

O resultado da classificação:

$ ls *.f | sort -t. -k1n
0.f
abc.f # note this file!
1.f
4.f
13.f
22.f

O que eu esperava era:

$ ls *.f | sort -t. -k1n
abc.f
0.f
1.f
4.f
13.f
22.f

Por que abc.f foi exibido logo após 0.f e antes de 1.f ? É porque 0 não é tratado como um número por sort ? Eu pesquisei na Web e não encontrei nenhuma referência.

    
por nn0p 27.12.2015 / 07:06

2 respostas

12

O motivo é porque ao usar a classificação numérica, as sequências sem números são tratadas como zero. A classificação GNU acerta o comportamento, mas não faz comentários sobre o motivo. A página man on illumos do tipo SunOS fornece uma explicação:

-n
Restricts the sort key to an initial numeric string, consisting of optional blank characters, optional minus sign, and zero or more digits with an optional radix character and thousands separators (as defined in the current locale), which is sorted by arithmetic value. An empty digit string is treated as zero. Leading zeros and signs on zeros do not affect ordering.

Esse comportamento também é especificado no SUSv4 e no POSIX.1-2008 ( link ), usando o mesmo palavreado que a página do homem illumos.

A classificação GNU também possui -g , "classificação numérica geral", que classifica por números de ponto flutuante em vez de números inteiros, em que as sequências de dígitos vazios são classificadas antes de zero. Não tenho certeza se isso é um efeito colateral ou intencional. No entanto, -g vem com um aviso, pois é significativamente mais lento que -n . Se você estiver classificando um conjunto de dados grande ou fazendo qualquer coisa que os usuários estejam esperando, você deve evitar -g .

    
por 27.12.2015 / 08:34
2

você pode usar -g

-g, --general-numeric-sort compare according to general numerical value

root@virt01-ubuntu:~# ls  | sort -t. -k1g
a.txt
0.txt
1.txt
2.txt
3.txt
root@virt01-ubuntu:~#

Espero que ajude.

    
por 27.12.2015 / 07:38

Tags