Commande Linux Sort : Guide Complet

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 champ
  • d : tri dictionnaire (uniquement lettres et espaces)
  • f : ignore la casse
  • i : ignore les caractères non imprimables
  • n : tri numérique
  • r : 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.

Étiquettes: commande-linux tri-donnees terminal-linux shell-scripting

Publié le 7 juin à 06h31