La commande sort constitue un outil essentiel dans l'écosystème Linux, spécialisé dans le tri de données. Ce guide vous permettra de maîtriser les fonctionnalités de cette commande en quelques minutes.
Syntaxe et options principales
La commande sort traite chaque ligne d'un fichier comme une unité de tri, comparant les caractères selon leurs valeurs ASCII pour produire un résultat ordonné.
Voici les options les plus couramment utilisées :
-u : Supprime les lignes en double
-r : Trie en ordre décroissant (par défaut, l'ordre est croissant)
-o : Redirige le résultat trié vers un fichier, similaire au symbole >
-n : Effectue un tri numérique, par défaut le tri est alphabétique
-t : Spécifie un délimiteur de champs
-k : Définit le numéro de champ à utiliser pour le tri
-b : Ignore les espaces en début de ligne
-R : Effectue un tri aléatoire, avec des résultats différents à chaque exécution
Exemples pratiques
Voici quelques exemples illustrant l'utilisation de la commande sort :
# trier les identifiants d'utilisateurs par ordre croissant
sort -n -t: -k3 utilisateurs.txt
# trier les identifiants d'utilisateurs par ordre décroissant
sort -nr -t: -k3 utilisateurs.txt
# trier un fichier contenant des nombres
sort -n donnees_numeriques.txt
# trier un fichier de nombres et supprimer les doublons
sort -nu donnees_numeriques.txt
# trier un fichier par ordre décroissant
sort -nr donnees.txt
# trier un fichier par ordre décroissant et supprimer les doublons
sort -nru donnees.txt
# trier un fichier numériquement et sauvegarder le résultat
sort -n donnees.txt -o resultat.txt
# trier un fichier de manière aléatoire
sort -R donnees.txt
# supprimer les lignes en d'un fichier
sort -u donnees.txt
Principe de fonctionnement
La commande sort traite chaque ligne comme une entité indépendante. Le processus de comparaison commence par le premier caractère de chaque ligne et progresse vers la droite, en se basant sur les valeurs ASCII des caractères. Le résultat final est un affichage en ordre croissant.
$ cat fruits.txt
banane
pomme
poire
orange
$ sort fruits.txt
pomme
banane
orange
poire
Option -u : suppression des doublons
Cette option simple permet d'éliminer les lignes identiques dans le résultat trié.
$ cat fruits.txt
banane
pomme
poire
orange
poire
$ sort fruits.txt
pomme
banane
orange
poire
poire
$ sort -u fruits.txt
pomme
banane
orange
poire
Comme on peut le voir, la ligne "poire" en double a été supprimée.
Option -r : ordre décroissant
Par défaut, sort organise les données en ordre croissant. L'option -r inverse cet ordre pour obtenir un tri décroissant.
$ cat nombres.txt
1
3
5
2
4
$ sort nombres.txt
1
2
3
4
5
$ sort -r nombres.txt
5
4
3
2
1
Option -o : sortie vers fichier
La commande sort affiche normalement ses résultats sur la sortie standard. Pour les enregistrer dans un fichier, on utilise généralement la redirection >.
Cependant, si vous souhaitez écrire le résultat trié dans le fichier original, la redirection classique ne fonctionne pas :
$ sort -r nombres.txt > nombres.txt
$ cat nombres.txt
Le fichier a été vidé.
L'option -o résout ce problème en permettant d'écrire le résultat dans le même fichier source :
$ cat nombres.txt
1
3
5
2
4
$ sort -r nombres.txt -o nombres.txt
$ cat nombres.txt
5
4
3
2
1
Option -n : tri numérique
Sans cette option, sort traite les nombres comme des chaînes de caractères, ce qui peut produire des résultats inattendus. Par exemple, "10" sera considéré comme inférieur à "2" car "1" précède "2" dans l'ordre alphabétique.
L'option -n force un tri numérique :
$ cat nombres.txt
1
10
19
11
2
5
$ sort nombres.txt
1
10
11
19
2
5
$ sort -n nombres.txt
1
2
5
10
11
19
Options -t et -k : tri sur champ spécifique
Lorsque les données sont structurées en colonnes séparées par un délimiteur, on peut spécifier sur quelle colonne effectuer le tri.
Considérons ce fichier de produits :
$ cat produits.txt
banane:30:5.5
pomme:10:2.5
poire:90:2.3
orange:20:3.4
Ce fichier contient trois colonnes séparées par deux-points : type de produit, quantité et prix. Pour trier par quantité (deuxième colonne) :
$ sort -n -k 2 -t : produits.txt
pomme:10:2.5
orange:20:3.4
banane:30:5.5
poire:90:2.3
Ici, nous utilisons le deux-points comme délimiteur et spécifions la deuxième colonne pour un tri numérique.
Autres options utiles
-f : convertit les minuscules en majuscules pour la comparaison (tri insensible à la casse)
-c : vérifie si le fichier est déjà trié, affiche des informations sur la première ligne désordonnée et retourne 1
-C : vérifie si le fichier est déjà trié, ne retourne que le code d'erreur 1 sans afficher de contenu
-M : trie en se basant sur les mois (JAN < FEB, etc.)
-b : ignore les espaces en début de ligne
Utilisation avancée de l'option -k
L'option -k (key) permet de spécifier précisément les champs et caractères à utiliser pour le tri. Sa syntaxe est complexe mais très puissante :
[FStart [.CStart]] [Modificateur] [, [FEnd [.CEnd]] [Modificateur]]
Préparons un fichier de données d'entreprise :
$ cat entreprises.txt
google 110 5000
baidu 100 5000
guge 50 3000
sohu 100 4500
Le premier champ représente le nom de l'entreprise, le deuxième le nombre d'employés, et le troisième le salaire moyen.
Tri par nom d'entreprise (premier champ) :
$ sort -t ' ' -k 1 entreprises.txt
baidu 100 5000
google 110 5000
guge 50 3000
sohu 100 4500
Tri par nombre d'employés (deuxième champ) :
$ sort -n -t ' ' -k 2 entreprises.txt
guge 50 3000
baidu 100 5000
sohu 100 4500
google 110 5000
Lorsque deux entreprises ont le même nombre d'employés, le tri se fait par défaut sur le premier champ (nom d'entreprise).
Tri par nombre d'employés, puis par salaire pour les ex-aequos :
$ sort -n -t ' ' -k 2 -k 3 entreprises.txt
guge 50 3000
sohu 100 4500
baidu 100 5000
google 110 5000
Tri décroissant par salaire, puis croissant par nombre d'employés :
$ sort -t ' ' -k 3r -k 2 entreprises.txt
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000
Ici, nous utilisons le modificateur r (reverse) pour le tri décroissant du salaire. On peut aussi combnier avec n pour un tri numérique :
$ sort -t ' ' -k 3nr -k 2n entreprises.txt
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000
Tri à partir du deuxième caractère du nom d'entreprise :
$ sort -t ' ' -k 1.2 entreprises.txt
baidu 100 5000
sohu 100 4500
google 110 5000
guge 50 3000
Tri uniquement sur le deuxième caractère du nom, puis par salaire décroissant :
$ sort -t ' ' -k 1.2,1.2 -k 3,3nr entreprises.txt
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000
Modificateurs supplémentaires pour -k :
Les modificateurs suivants peuvent être utilisés avec l'option -k :
b: ignore les espaces en début de champd: tri dictionnaire (uniquement lettres et espaces)f: ignore la cassei: ignore les caractères non imprimablesn: tri numériquer: tri décroissant
Interaction entre -k et -u :
L'option -u supprime les lignes dupliquées en se basant uniquement sur les champs spécifiés par les options -k :
$ sort -n -k 2 -u entreprises.txt
guge 50 3000
baidu 100 5000
google 110 5000
Ici, "sohu" a été supprimé car il a le même nombre d'employés que "baidu". Avec plusieurs champs de tri :
$ sort -n -k 2 -k 3 -u entreprises.txt
guge 50 3000
sohu 100 4500
baidu 100 5000
google 110 5000
Dans ce cas, aucune ligne n'est supprimée car même si deux entreprises ont le même nombre d'employés, leurs salaires sont différents.
Cas particuliers
Tri sur une portion de champ :
$ sort -n -k 2.2,3.1 entreprises.txt
guge 50 3000
baidu 100 5000
sohu 100 4500
google 110 5000
Ceci trie en se basant sur le deuxième caractère du deuxième champ jusqu'au premier caractère du troisième champ.
Ancienne syntaxe obsolète :
On peut encore trouver d'anciennes utilisations de sort avec la syntaxe +POS1 [-POS2], qui est obsolète au profit de l'option -k. Cette ancienne syntaxe commence la numérotation à 0 plutôt qu'à 1.