É sort -k1,2 equivalente a sort -k1,1 -k2,2?

1

Estou experimentando com o GNU sort e LC_COLLATE="en_US.UTF-8". Eu tenho um arquivo chamado 'teste':

1,0 1
10 2
1,0 3
10 4

Com sort -k1,2 e também com sort test , a ordem não muda:

$ sort -k1,2 test
1,0 1
10 2
1,0 3
10 4

Então, o tipo acha que '1,0' é igual a '10' provavelmente devido a algumas peculiaridades de LC_COLLATE (pular pontuação?)

Agora, quando eu uso sort -k1,1 -k2,2 , isso me dá uma ordem diferente:

$ sort -k1,1 -k2,2 test
10 2
10 4
1,0 1
1,0 3

e de repente não acha que '10' é o mesmo que '1,0'.

O que aconteceu? Por que razão não é sort -k1,1 -k2,2 equivalente a sort -k1,2 neste caso? Deveria ser realmente equivalente? Ou eu interpretei mal a man page? (Eu tentei versões 8.22 e 8.29 de coreutils, ambos têm esse comportamento)

    
por lutyj 19.07.2018 / 18:11

1 resposta

2

-k1,2 significa “classificar todas as linhas, comparando o conteúdo de todos os campos de 1 a 2 simultaneamente”; então “1,0 1” é comparado com “10 2”, etc.

-k1,1 -k2,2 significa “classificar todas as linhas, comparando o conteúdo do campo 1 e quando duas linhas têm o mesmo conteúdo no campo 1, comparando o conteúdo do campo 2”; então “1,0” é comparado com “10”, depois “2” com “4” etc.

O que acontece então, em ambos os casos, resume-se ao agrupamento, em particular a ponderação. Os dígitos geralmente têm um peso maior que a pontuação e o espaçamento. Ao comparar “1,0 1” e “10 2”, a diferença devido à vírgula é ignorada porque os dígitos são diferentes. Ao comparar "1,0" e "10", a única diferença é a vírgula, por isso não é mais ignorada. Veja ISO 14651 para detalhes.

Você pode definir LC_COLLATE=C para obter agrupamento com base apenas nos valores dos caracteres, sem pesos. Seus exemplos resultam em

1,0 1
1,0 3
10 2
10 4

quando a localidade "C" é usada.

    
por 19.07.2018 / 18:27

Tags