'echo -e' Q \ ns \ nV '| sort 'não classifica

1

Por que:

$ echo -e 'Q\ns\nV'  | sort 

saídas

Q
s
V

sem alterar a ordem da minha lista (levando em conta o menor / maiúsculo?)

    
por Pierre 21.01.2013 / 11:08

2 respostas

4

Na maioria dos idiomas, s classifica antes de V , independentemente do caso.

A classificação depende das configurações de localização ( LANG e LC_* variables).

Você pode usar: LC_ALL=C sort se quiser classificar de acordo com a ordem do valor de byte, mas isso pode não fazer o que você deseja se estiver em uma localidade com vários bytes.

Se você quiser classificar na ordem do seu próprio idioma, mas com letras maiúsculas antes das minúsculas, pode fazer:

sed 's/./0&/g;s/0\([[:lower:]]\)/1/g' |
  sort |
sed 's/.\(.\)//g'

Isso faria com que as letras minúsculas fossem classificadas depois de todos os outros caracteres.

$ print -l Q s d é f D É F V | sort
d
D
é
É
f
F
Q
s
V

$ print -l Q s d é f D É F V | sed 's/./0&/g;s/0\([[:lower:]]\)/1/g' |
 sort |
 sed 's/.\(.\)//g'
D
É
F
Q
V
d
é
f
s

Isso só funcionaria em localidades onde os elementos de agrupamento são apenas caracteres únicos.

    
por 21.01.2013 / 11:16
3
A ordem de classificação de

sort depende das configurações de localidade do seu ambiente. Na página sort .

   *** WARNING *** The locale specified by the environment affects sort  order.
   Set LC_ALL=C to get the traditional sort order that uses native byte values.

O código de idioma POSIX ou C fará com que sort se comporte como esperado:

reedm@www:~ $ echo -e 'Q\ns\nV' | LC_ALL='' sort 
Q
s
V
reedm@www:~ $ echo -e 'Q\ns\nV' | LC_ALL='' sort --ignore-case
Q
s
V
reedm@www:~ $ echo -e 'Q\ns\nV' | LC_ALL='c' sort 
Q
V
s
reedm@www:~ $ echo -e 'Q\ns\nV' | LC_ALL='c' sort --ignore-case
Q
s
V
    
por 21.01.2013 / 11:31