2011-06-30 4 views
2

-je utiliser un fichier trilinux sorte de sortie inattendue

 
ABC 
AB-C 
ABCDEFG-HI 

Je reçois

 
ABC 
AB-C 
ABCDEFG-HI 

pourquoi n'ordonne la chaîne de tri de cette façon? comment puis-je faire trier '-' par ordre alphabétique?

+0

S'il vous plaît poster l'appel 'sort' exact que vous utilisez, vous êtes probablement mal le faire. – DarkDust

Répondre

4

La solution fournie par @cnicutar est correcte, mais la raison doit être expliquée, c'est pourquoi je donne une nouvelle réponse.

Après la discussion avec @cnicutar où à la fin, je doutais un bogue dans coreutils' sort Je trouve que this sorting behavior is expected:

A ce genre de points apparaît cassé parce que le cas est plié et la ponctuation est ignorée parce que « en_US .UTF-8 'spécifie ce comportement.

Donc sort, votre entrée semble être mis en correspondance comme suit:

ABC -> ABC 
AB-C -> ABC 
ABCDEFG-HI -> ABCDEFGHI 

Si vous souhaitez que le tri ASCII pur, vous devez appeler LC_ALL=C sort (définir temporairement les paramètres régionaux à C lorsque vous appelez sort ce qui signifie comportement "standard" sans localisation, vous pouvez également utiliser POSIX au lieu de C).

Sur les autres Unix, ce comportement semble différent (testé sur Mac OS X dont les outils utilisateur sont dérivés de FreeBSD), mais LC_ALL=C sort devrait avoir le même comportement sur tous les systèmes POSIX.

+0

Bon à savoir, merci :-) – cnicutar

2

Je me souviens :)) essayer

[[email protected] ~]$ LANG=POSIX sort 
ABC 
AB-C 
ABCDEFG-HI 
AB-C 
ABC 
ABCDEFG-HI 

Sinon LANG=C devrait fonctionner.

+0

Dans aucun paramètre de langue, le 'AB-C' devrait apparaître au milieu (pas même avec EBCDIC), donc je parie que ce n'est pas le problème mais plutôt la façon dont user678070 appelle' sort'. – DarkDust

+0

@DarkDust Je l'ai juste essayé avec différents 'LANG's. Pour 'en_US.utf8', il fait ce que l'op dit (j'avais déjà ce problème). Faites un 'locale -a' et choisissez-en un. – cnicutar

+0

@cnicutar: Je viens de l'essayer moi-même et j'obtiens toujours le bon tri. Et étant donné que seuls les caractères ASCII sont utilisés, je doute fort que 'en_US.utf8' aboutisse à ce tri étrange car UTF-8 a ASCII comme sous-ensemble. Avez-vous la sortie "unsorted" en utilisant 'LANG = foobar'? Si c'est le cas, votre tri ne triera pas s'il ne trouve pas les paramètres régionaux. – DarkDust