Qual é a ordem padrão da classificação do Linux?

18

Por um longo período, pensei que o comportamento padrão do sortprograma estivesse usando a ordem ASCII. No entanto, quando insiro as seguintes linhas sortsem argumentos:

#
@

Eu tenho:

@
#

Mas, de acordo com a tabela ASCII, #é 35 e @é 64. Outro exemplo é:

A
a

E a saída é:

a
A

Alguém pode explicar isso? A propósito, o que é 'ordem de dicionário' ao usar sort -d?

G-Man Diz 'Reinstate Monica'
fonte
5
ordem de classificação depende de suas configurações de localidade
janneb
2
Mas é ordem alfabética por padrão, pelo menos na classificação GNU.
Jarno

Respostas:

17

Parece que você está usando um código de idioma não POSIX.

Experimentar:

export LC_ALL=C

e depois sort.

info sort diz claramente:

(1) Se você usar um código de idioma que não seja POSIX (por exemplo, configurando `LC_ALL 'como` en_US'), então 'sort' poderá produzir uma saída classificada de maneira diferente da que você está acostumado. Nesse caso, defina a variável de ambiente `LC_ALL 'como` C'. Observe que definir apenas `LC_COLLATE 'tem dois problemas. Primeiro, é ineficaz se `LC_ALL 'também estiver definido. Segundo, ele tem um comportamento indefinido se `LC_CTYPE '(ou` LANG', se `LC_CTYPE 'não estiver definido) estiver definido como um valor incompatível. Por exemplo, você obtém um comportamento indefinido se `LC_CTYPE 'for` ja_JP.PCK', mas `LC_COLLATE 'for` en_US.UTF-8'.

codaddict
fonte
3
O OP está perguntando qual é a ordem de classificação, não como alterá-la.
1
Obrigado, eu testei na minha máquina e configurações locais afetam tipo de comportamento
2

Para determinar a ordem de classificação, basta criar um arquivo com um caractere diferente em cada linha e classificá-lo. A saída resultante informará a ordem de classificação.

Gabe
fonte
Bom, simples e eficiente
1
Geralmente uma ideia muito boa, mas nem sempre é suficiente. Um agrupamento não precisa ser definido apenas em caracteres individuais. Algumas colações tratam "ae" como se fosse uma ligadura ou tratam as ligaduras como se fossem decompostas. Outro caso é que muitos agrupamentos tratam 'a' e 'A' como iguais, mas a ordem que você vê no teste não diz isso (pode ser que a classificação seja estável). E um teste de caractere único não informa se a expansão da guia, a normalização de espaço em branco etc. estão em vigor. No entanto, é um bom lugar para começar.
TextGeek
1
(tarde demais para editar o comentário anterior) - contanto que você inclua uma variedade de caracteres suficientemente diversa, é possível ignorar maiúsculas e minúsculas ao ver (por exemplo) aAbB em vez de abAB.
TextGeek
2

Como man sortdiz, "ordem do dicionário" significa "considere apenas espaços em branco e caracteres alfanuméricos". Por exemplo, dados os dados

The
!quick
brown
@fox
jumps
#over
17
$lazy
  dogs
%42
times.

o sortcomando sem adornos produz

  dogs
!quick
#over
$lazy
%42
@fox
17
brown
jumps
The
times.

(colocando as linhas que começam com os caracteres de espaço e !, #, $, %, e @símbolos 1 à frente das linhas que começam com letras e números, ou seja, caracteres alfanuméricos ), mas sort -dproduz

  dogs
17
%42
brown
@fox
jumps
$lazy
#over
!quick
The
times.

  dogsainda é o primeiro, porque começa com espaços, mas os caracteres especiais (pontuação) são ignorados.  17vem antes 42, e foxvem entre browne jumps, apesar do fato de que 42e foxtêm personagens na frente deles, que normalmente se deslocam-los antes do 17.
____________
1 na ordem de seus valores ASCII: espaço = 040, != 041, #= 043, $= 044, %= 045 e @= 0100. Observe que (desconsiderando a barra de espaço) essa ordem é aproximadamente da esquerda para a direita em alguns teclados.

G-Man Diz 'Reinstate Monica'
fonte