2015-03-05 1 views
1

Je remarque les sorties de tri suivantes. Qui comprend pourquoi le '.' est trié devant la première fois et à la fin la deuxième fois? J'essayais de déboguer un programme qui recherche des lignes dans un grand fichier trié, mais le coupable semble être mon attente/compréhension du tri linux.linux ordre de tri que je ne comprends pas

$ sort --debug 
sort: using ‘en_US.UTF-8’ sorting rules 
/mnt/x/E 
/mnt/x/. 
<ctrl-D> 
/mnt/x/. 
________ 
/mnt/x/E 
________ 
$ sort --debug 
sort: using ‘en_US.UTF-8’ sorting rules 
/mnt/x/Ed 
/mnt/x/.T 
<ctrl-D> 
/mnt/x/Ed 
_________ 
/mnt/x/.T 
_________ 
$ 
+1

@KarolyHorvath il est écrit par 'sort' lui-même lorsque vous l'exécutez avec' --debug'. Au moins, aussi pour moi dans 'sort GNU 8.21'. – fedorqui

+0

qui a été ajouté par l'option --debug, qui "met en surbrillance" les parties utilisées comme clé de tri – EdDude

+1

note que cela n'a rien à voir avec l'option '--debug'. Un exemple de fichier avec ces lignes et ensuite 'sort class' a le même comportement. Au moins pour moi. – fedorqui

Répondre

3

Ce n'est pas que "." vient avant ou après d'autres caractères - c'est que ce n'est pas examiné du tout; c'est un tri purement basé sur les caractères alphabétiques. Dans votre premier exemple, <end-of-string> trie avant E; dans le deuxième exemple, E trie avant T.

Ce comportement dépend des paramètres régionaux pour le classement. Vous pouvez influencer cela avec des variables d'environnement, telles que LC_COLLATE:

$ env LC_COLLATE=C sort 
/mnt/x/Ed 
/mnt/x/.T 
^D 
/mnt/x/.T 
/mnt/x/Ed 
$ env LC_COLLATE=en_US.UTF-8 sort 
/mnt/x/Ed 
/mnt/x/.T 
^D 
/mnt/x/Ed 
/mnt/x/.T 
$ 

Dans les paramètres régionaux C, tous les caractères ASCII sont considérés, et sont classés dans leur ordre ASCII; dans de nombreux autres endroits, la ponctuation est ignorée - c'est probablement ce qui provoque le comportement que vous voyez.

Vous pouvez examiner vos paramètres régionaux à l'aide de la commande locale.

+0

Merci! Cela résout ma difficulté. – EdDude