Linux / Commande sort : trier du texte, des nombres et des champs
sort trie les lignes d'un texte et écrit le résultat sur la sortie standard. Utilisez -n pour comparer des nombres, -k pour choisir un champ et -r pour inverser l'ordre. La lecture d'un fichier ne le modifie pas ; l'enregistrement du résultat demande une destination explicite.
Par défaut, l'ordre dépend des règles de comparaison de la locale active. Les exemples ci-dessous utilisent LC_ALL=C pour obtenir un ordre reproductible ; ce choix correspond à une comparaison selon la locale C, et non à un classement linguistique français des mots accentués. Vérifiez les options disponibles avec man sort sur votre système.
Syntaxe et entrée standard
sort [options] [fichiers…]
Sans fichier, sort lit son entrée standard. Avec plusieurs fichiers, il trie l'ensemble de leurs lignes, sans conserver des groupes séparés par fichier. Pour une première expérience sans créer de fichier :
printf 'zebra\napple\nbanana\n' | LC_ALL=C sort
Résultat attendu :
apple
banana
zebra
La commande attend la fin de l'entrée pour terminer son travail. Elle convient au tri d'un ensemble de lignes disponible, plutôt qu'à l'affichage immédiat d'un journal qui continue à recevoir des données.
Préparer de petits fichiers pour les exemples
Dans Bash, créez un répertoire d'exercice neuf, puis placez-vous dedans. Les fichiers qui suivent servent uniquement à l'apprentissage :
sort_lab=$(mktemp -d "$HOME/sort-lab.XXXXXX")
cd -- "$sort_lab"
printf 'zebra\napple\nbanana\n' > names.txt
printf '10\n2\n30\n' > scores.txt
printf 'zoe 10\nalice 2\nbob 10\n' > results.txt
mktemp -d choisit un nouveau répertoire pour éviter d'écraser vos documents. Gardez ce chemin si vous souhaitez retrouver les fichiers. Pour quitter l'exercice, revenez à votre répertoire personnel avec cd "$HOME" ; les données d'origine n'ont pas été utilisées.
Distinguer tri textuel et tri numérique
Triez d'abord les noms et les nombres sans option numérique :
LC_ALL=C sort names.txt
LC_ALL=C sort scores.txt
Les noms donnent le même résultat que l'exemple précédent. Les nombres s'affichent dans l'ordre 10, 2, 30 : le tri textuel compare leurs caractères. Pour demander l'ordre des valeurs numériques :
LC_ALL=C sort -n scores.txt
LC_ALL=C sort -nr scores.txt
La première commande donne 2, 10, 30. La seconde donne 30, 10, 2. Sous la locale C, le séparateur décimal est le point. L'option -n n'interprète pas la notation exponentielle ni un signe + initial comme le ferait un analyseur numérique général ; GNU sort propose -g pour ce type d'entrée.
Trier sur un champ et traiter les égalités
Pour classer results.txt selon son deuxième champ numérique :
LC_ALL=C sort -k2,2n results.txt
alice 2
bob 10
zoe 10
Les champs sont numérotés à partir de 1. -k2,2n limite la clé au deuxième champ et lui applique une comparaison numérique. Écrire seulement -k2 étend la clé jusqu'à la fin de la ligne : ce n'est pas une façon générale de sélectionner uniquement la deuxième colonne.
Quand les clés sont égales, GNU sort compare normalement la ligne entière pour départager les enregistrements. Ici, bob 10 passe donc avant zoe 10. Pour conserver l'ordre d'entrée des lignes de même clé, ajoutez -s :
LC_ALL=C sort -s -k2,2n results.txt
alice 2
zoe 10
bob 10
Vous pouvez aussi choisir explicitement un second critère avec sort -k2,2n -k1,1. Par défaut, les blancs participent à la délimitation des champs selon les règles de sort. Un séparateur explicite se définit avec -t :
printf 'zoe:10\nalice:2\nbob:10\n' | LC_ALL=C sort -t ':' -k2,2n -k1,1
Le résultat est alice:2, bob:10, puis zoe:10. Un tri par séparateur simple n'est pas un analyseur CSV complet : des champs entre guillemets qui contiennent eux-mêmes ce séparateur demandent un outil adapté.
Comprendre ce que supprime sort -u
-u ne conserve qu'une ligne par valeur de comparaison. Sans clé particulière, il permet de trier et de retirer les doublons de lignes. Avec une clé, des enregistrements différents peuvent être considérés comme égaux :
LC_ALL=C sort -u -k2,2n results.txt
La sortie ne contient qu'une ligne pour la valeur 2 et une ligne pour la valeur 10. Vous perdez donc l'un des deux noms associés à 10. N'utilisez pas cette option si chaque enregistrement doit être conservé ; -s conserve les égalités tout en respectant leur ordre initial.
La commande uniq répond à un autre besoin : elle retire les répétitions adjacentes, sans trier les lignes. sort -n -u et sort -n | uniq ne sont pas équivalents en général, car le premier peut comparer uniquement les valeurs numériques alors que le second retire les lignes entières identiques.
Enregistrer sans vider le fichier d'entrée
Pour garder la source intacte, choisissez un nouveau nom de sortie :
LC_ALL=C sort names.txt > names-sorted.txt
cat names-sorted.txt
cat names.txt
Le premier affichage commence par apple, le second reste dans l'ordre initial zebra, apple, banana. Vérifiez que la destination choisie ne contient pas déjà un document à conserver, car > peut l'écraser.
Ne redirigez pas la sortie vers le fichier d'entrée avec sort names.txt > names.txt. Le shell peut vider le fichier avant que sort ne le lise. GNU sort permet un remplacement explicite avec -o, après sauvegarde :
cp -- names.txt names-backup.txt
LC_ALL=C sort -o names.txt names.txt
LC_ALL=C sort -c names.txt
Pour cet exemple, sort -c ne produit aucun message et se termine avec un statut 0 si le fichier est correctement trié. Une entrée désordonnée provoque un diagnostic et le statut 1. Ne confondez pas cette vérification avec la production d'une nouvelle sortie triée.
Le remplacement avec -o n'est pas une garantie contre une panne ou une erreur d'entrée-sortie. Pour des données importantes, conservez la sauvegarde et privilégiez une nouvelle destination dont vous contrôlez le contenu avant remplacement. Pour revenir à l'exemple initial, le fichier names-backup.txt conserve les trois lignes d'origine.
Options à retenir et diagnostic
| Option | Utilisation |
|---|---|
-n |
Comparer des nombres plutôt que leur écriture textuelle. |
-r |
Inverser l'ordre de comparaison. |
-k début,fin |
Délimiter une clé ; -k2,2n sélectionne le deuxième champ numérique. |
-t caractère |
Choisir un séparateur de champs explicite. |
-s |
Conserver l'ordre d'entrée des lignes dont les clés sont égales. |
-u |
Ne conserver qu'une ligne par clé égale. |
-o fichier |
Écrire le résultat dans ce fichier avec GNU sort. |
-c |
Vérifier l'ordre sans produire le texte trié. |
Si le résultat semble incorrect, contrôlez d'abord la locale, le choix textuel ou numérique, le séparateur et les bornes de la clé. Avec GNU sort, --debug aide à repérer la portion réellement comparée. Les règles précises et les différences d'options sont décrites dans le manuel officiel de GNU sort.




