Un pense-bête

Trucs de geek : Trier des fichiers texte

Lorsque l'on écrit des scripts bash on peut être amené à avoir à trier un fichier texte. La commande sous Linux est "sort" suivi d'options et du nom du fichier contenant les données à lire en entrée.

Soit le fichier test.txt contenant :

zzz
aaa
bbbb

Le trier consiste à saisir à la console (ou mettre dans un script bash) :

$ sort text.txt

donne

aaa
bbbb
zzz

Si il y a une ligne vide dans le fichier elle sera en première ligne. De la même manière s'il y a des chiffres ils seront triés et placés en début de fichiers. Naturellement il est possible de rediriger la sortie vers un fichier avec un "> out.txt" par exemple.

Si vous avez un doute sur le tri du fichier le mieux est de le lui demander :

$ sort -c test.txt

donne

sort : test.txt:2: désordre : aaa

Pour le trier à l'envers (option reverse) :

$ sort -r test.txt

qui donne :

zzz
bbbb
aaa

Pour supprimer les lignes en double il faut passer l'option "-u".

Mais on n'a pas toujours la chance d'avoir le critère de tri en première position. Regarder ce fichier :

999aaa;
111zzz;
888bbbb;
555zzz;

Imaginez que vous souhaitiez le trier par ordre croissant sur les chiffres qu'il contient. Il suffit de saisir dans ce cas :

$ sort -t';' -k 2 test.txt

Le t permet d'indiquer le critère de séparation des champs (espace par défaut) et le k permet d'indiquer que l'on veut trier sur le 2ème colonne. Avec l'option r on fait le même tri mais à l'envers.

Cela donne :

aaa;111
bbbb;555
zzz;888
zzz;999

Enfin pour envoyer directement le résultat dans un fichier l’option "o" suivi du nom du fichier le fait :

$ sort -t';' -k 2 test.txt -o out.txt

Autre cas : les données numériques. Soit le fichier suivant :

10
11
12
1.0
2
21
22
30
3

Si on le tri simplement on obtient :

10
1.0
11
12
2
21
22
3
30

Il faut forcer un tri sur des données numériques via la commande suivante :

$ sort test.txt -V

Qui donne bien :

1.0
2
3
10
11
12
21
22
30

Fait le 11-04-2013

Tags: geek, sort, bash