GNU/Linux >> Tutoriels Linux >  >> Linux

Spécifiez l'ordre de tri avec LC_COLLATE afin que les minuscules soient avant les majuscules

Je ne connais aucun paramètre régional qui, par défaut, trie dans cet ordre. La solution consiste à créer des paramètres régionaux personnalisés avec un ordre de tri personnalisé. Si quelqu'un, quatre ans plus tard, veut trier de manière personnalisée, voici l'astuce.

La grande majorité des paramètres régionaux ne spécifient pas leur propre ordre de tri, mais copient plutôt l'ordre de tri défini dans /usr/share/i18n/locales/iso14651_t1_common c'est donc ce que vous voudrez modifier. Plutôt que de changer l'ordre de tri pour presque tous les paramètres régionaux en modifiant le iso14651_t1_common d'origine , je vous suggère de faire une copie. Détails sur le fonctionnement de l'ordre de tri et sur la création de paramètres régionaux personnalisés dans votre $HOME répertoire sans accès root se trouvent dans cette réponse à une question similaire.

Découvrez comment a et A sont classés en fonction de leurs entrées dans iso14651_t1_common :

<U0061> <a>;<BAS>;<MIN>;IGNORE # 198 a
<U0041> <a>;<BAS>;<CAP>;IGNORE # 517 A

b et B sont similaires :

<U0062> <b>;<BAS>;<MIN>;IGNORE # 233 b
<U0042> <b>;<BAS>;<CAP>;IGNORE # 550 B

On voit qu'au premier passage, les deux a et A avoir le symbole d'assemblage <a> , tandis que les deux b et B avoir le symbole d'assemblage <b> . Depuis <a> apparaît avant <b> en iso14651_t1_common , a et A sont à égalité avant b et B . La deuxième passe ne rompt pas les liens car les quatre caractères ont le symbole d'assemblage <BAS> , mais lors de la troisième passe, les liens sont résolus car le symbole d'assemblage pour les lettres minuscules <MIN> apparaît à la ligne 3467, avant le symbole de classement pour les lettres majuscules <CAP> (ligne 3488). Ainsi, l'ordre de tri se termine par a , A , b , B .

L'échange des premier et troisième symboles de classement trierait les lettres d'abord par casse (minuscule puis majuscule), puis par accent (<BAS> signifie sans accent), puis par ordre alphabétique. Cependant , les deux <MIN> et <CAP> viennent avant les chiffres numériques, cela aurait donc pour effet indésirable de placer des chiffres après les lettres.

Le moyen le plus simple de garder les chiffres en premier tout en faisant tous les lettres minuscules viennent avant tous majuscules est de forcer toutes les lettres à s'attacher lors de la première comparaison en les mettant toutes égales à <a> . Pour vous assurer qu'ils sont triés par ordre alphabétique dans la casse, remplacez le dernier symbole de classement par IGNORE au premier symbole d'assemblage actuel. En suivant ce modèle, a deviendrait :

<U0061> <a>;<BAS>;<MIN>;<a> # 198 a

A deviendrait :

<U0041> <a>;<BAS>;<CAP>;<a> # 517 A

b deviendrait :

<U0062> <a>;<BAS>;<MIN>;<b> # 233 b

B deviendrait :

<U0042> <a>;<BAS>;<CAP>;<b> # 550 B

et ainsi de suite pour le reste des lettres.

Une fois que vous avez créé une version personnalisée de iso14651_t1_common , suivez les instructions de la réponse ci-dessus pour compiler vos paramètres régionaux personnalisés.


Réglage LC_COLLATE=C n'est pas toujours suffisant pour trier les majuscules avant les minuscules. Vous devrez peut-être définir LC_ALL=C .

Cela prendra également en compte les caractères non alphanumériques et même non imprimables, mais si vous ne voulez pas qu'il y ait des options -d et -i (décrit dans man sort ) pour le désactiver.

Cependant, cela échouera probablement gravement avec une entrée multioctet, telle que UTF-8 avec des caractères non ASCII.

Pour obtenir des minuscules (dans l'ordre) avant des majuscules (dans l'ordre), la meilleure façon de penser à cela n'implique pas de sortir un langage de programmation à part entière est d'inverser la casse de toutes les lettres avant le tri, et de les inverser après.

tr 'a-zA-Z' 'A-Za-z' < file | LC_ALL=C sort | tr 'a-zA-Z' 'A-Za-z'

Je ne suis pas un expert mais je n'ai jamais vu de paramètres régionaux qui définissent le classement comme celui-ci. AFAIK ce classement est uniquement en C où il est basé sur des valeurs ASCII. (Normalement, je résoudrais simplement cela par un script.)

Cependant, je n'ai jamais fait cela, mais vous voudrez peut-être consulter les pages de manuel localedef(1) et locale(5) pour comprendre comment les paramètres régionaux sont définis et éventuellement définir le vôtre.

N'oubliez pas non plus que s'il y a des signes diacritiques ou des caractères spéciaux, la locale C ne les traitera pas comme vous le souhaiteriez. Par exemple, il ne mettra pas á près de a ou Ł près de L . Dans de tels cas, les paramètres régionaux natifs de la langue seraient probablement un meilleur point de départ.


Linux
  1. Trier les fichiers dans un dossier spécifique avec Ranger ?

  2. Craquage dans le Cloud avec les GPU CUDA

  3. Trier plusieurs clés avec le tri Unix

  4. Tri sur le dernier champ d'une ligne

  5. '&&' vs '&' avec la commande 'test' dans Bash

Apprendre Linux avec le Raspberry Pi

Commande de tri Linux avec exemples

10 exemples utiles de la commande Sort sous Linux

Améliorer la collaboration avec le cloud

Sécurisez Linux avec le fichier Sudoers

Est-il possible de modifier un élément dans le DOM avec Puppeteer avant de créer une capture d'écran ?