Pourquoi le «tri» ignore-t-il les caractères spéciaux, comme l'astérisque?

27

Je pensais que sortcela trierait les préfixes communs, mais cela ne se produit pas toujours. Prenez cette entrée par exemple:

AT0S*eightieths
AT0S*eyetooth's
AT*ad
AT*Ad
AT*AD
AT*Eydie
AT*eyed
ATF*adv
ATF*ATV
ATF*edify
ATF*Ediva
ATFKT*advocate
ATFKTNK*advocating
ATFKT*outfought
ATFKTS*advocates
ATHT*whitehead
ATHT*Whitehead
AT*id
AT*I'd
AT*Ito
AT*IUD
ATJ*adage
ATNXNS*attention's
ATNXNS*attenuation's
ATNXNS*autoignition's
AT*oat
AT*OD
AT*outweigh
AT*owed
ATP0K*idiopathic
ATP*adobe
ATT*wighted
ATT*witted
ATT*wooded
AT*UT
AT*Uta
AT*wowed
AT*Wyatt
ATX*atishoo

Après sort, je m'attendrais à ce que tous AT*finissent en un seul morceau, mais lorsque vous exécutez ces données sort, l' ==entrée de sortie . Pourquoi donc? Je ne spécifie aucune option pour ignorer les caractères non alphabétiques ou quoi que ce soit. Justement sort dict > out.

Ma version de sortvient de coreutils 8.5-1ubuntu3.

Aaron Digulla
la source
Travaille pour moi. Peut-être un alias quelque part?
Matthieu Cartier

Réponses:

17
sort --version-sort filename 

Cela préserve l'ordre naturel des nombres.

Reuben L.
la source
4
+1 Ça marche mais pourquoi? Le texte ne contient que quelques chiffres.
Aaron Digulla
2
Fonctionne sans avoir besoin de changer l'environnement, +1
Meredith
@AaronDigulla: Je soupçonne qu'il traite les chaînes dans le tri de version comme presque le moyen le plus stupide de trier les choses, donc il ignore les paramètres régionaux et ne gère les nombres que d'une manière spéciale.
JohnEye
23

La définition de LC_ALL = C a rétabli l'ordre de tri traditionnel dans mon cas. Paquet: coreutils Version: 8.5-1ubuntu3

export LC_ALL=C 
rahul_jk
la source
LANG=Cfonctionne également. Ce qui me laisse perplexe: LANGest réglé sur en_US.UTF-8; pourquoi est *toujours traité spécial ??
Aaron Digulla
2
LC_COLLATEest le paramètre spécifique à sort, etc.
Suspendu jusqu'à nouvel ordre.
fonctionne pour moi dans Raspbian // Pixel ... le genre 'agacement' ignorant les caractères spéciaux me tuait ... merci.
ZEE
2
pas besoin exportni même de régler localement et éventuellement de jouer avec autre chose. Il suffit de le mettre dans l'appel à tri: LC_ALL=C sort. Par exemple echo -e 'a\n*\n*b\nc' | LC_ALL=C sort, LC_ALL ne sera pas modifié en dehors de l'appel pour trier
Hashbrown
1

Cela fonctionne comme prévu pour moi (sur cygwin).

sort input > output résulte en

AT * AD
AT * Ad
AT * Eydie
À * je
AT * IUD
AT * Ito
AT * OD
AT * UT
AT * Uta
AT * Wyatt
AT * ad
AT * eyed
AT * id
À * avoine
AT * l'emporte sur
AT * dû
AT * séduit
AT0S * quatre-vingtièmes
Bluetooth AT0S *
ATF * ATV
ATF * Ediva
ATF * adv
ATF * edify
Défenseur d'ATFKT *
ATFKT * battu
ATFKTNK * plaidant
Défenseurs d'ATFKTS *
ATHT * Whitehead
ATHT * whitehead
ATJ * adage
ATNXNS * attention
Atténuation ATNXNS *
Auto-allumage ATNXNS *
ATP * adobe
ATP0K * idiopathique
ATT * wighted
ATT * witted
ATT * boisé
ATX * atishoo

Le tri est-il lié à quelque chose? essayer\sort

Également

Les paramètres régionaux spécifiés par l'environnement affectent l'ordre de tri. Définissez LC_ALL = C pour obtenir l'ordre de tri traditionnel qui utilise des valeurs d'octets natives

Nifle
la source
Pas d'alias. Doit être une fonctionnalité spécifique à ubuntu / debian.
Aaron Digulla
1

Version: trier (GNU coreutils) 8.26

Je le fais en ligne:

LANG=C sort FILE

Ou par fonction (modifie le fichier d'origine):

dosort() { local file="$*"; LANG=C sort ${file} -o ${file}.swp; mv ${file}.swp ${file}; cat ${file} ;}
Regis Barbosa
la source
1

Pour fournir une réponse simple basée sur les commentaires des autres, cela ne change pas votre environnement:

input_program | LC_COLLATE=C sort | output_program

ou

LC_COLLATE=C sort < input_file > output_file

ou leurs combinaisons.

Walf
la source
0

Avec le tri GNU, vous pouvez utiliser --dictionary-order:

NAME
       sort - sort lines of text files

SYNOPSIS
       sort [OPTION]... [FILE]...
       sort [OPTION]... --files0-from=F

DESCRIPTION
       Write sorted concatenation of all FILE(s) to standard output.

       With no FILE, or when FILE is -, read standard input.

       Mandatory arguments to long options are mandatory for short options too.  Ordering options:

       -b, --ignore-leading-blanks
              ignore leading blanks

       -d, --dictionary-order
              consider only blanks and alphanumeric characters
Igor
la source