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 foi abc.f
mostrado logo após 0.f
e antes 1.f
? É porque 0
não é tratado como um número por sort
? Pesquisei na web e não encontrei nenhuma referência.
LC_ALL=C
.Respostas:
O motivo é que, ao usar a classificação numérica, as seqüências sem números são tratadas como zero. A classificação GNU corrige o comportamento, mas não faz nenhum comentário sobre o porquê. A página de manual em illumos para classificação do SunOS fornece uma explicação:
Esse comportamento também é especificado no SUSv4 e no POSIX.1-2008 ( http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sort.html ), usando a mesma verbosidade da página do manual illumos.
A classificação GNU também possui
-g
"classificação numérica geral", que é classificada por números de ponto flutuante, em vez de números inteiros, onde as cadeias de dígitos vazias são classificadas antes de zero. Não tenho certeza se esse é um efeito colateral ou intencional. No entanto,-g
vem com um aviso, pois é significativamente mais lento que-n
. Se você estiver classificando um grande conjunto de dados ou fazendo qualquer coisa que os usuários aguardem, evite-g
.fonte
sort
lida com duas linhas com a mesma chave.você pode usar -g
fonte