GNU/Linux >> Tutoriels Linux >  >> Linux

Soyez trié avec sort en ligne de commande

Si vous avez déjà utilisé un tableur, vous savez que les lignes peuvent être triées en fonction du contenu d'une colonne. Par exemple, si vous avez une liste de dépenses, vous voudrez peut-être les trier par date ou par prix croissant ou par catégorie, etc. Si vous êtes à l'aise avec un terminal, vous ne voudrez peut-être pas utiliser une grosse application bureautique juste pour trier les données textuelles. Et c'est exactement ce que le sort la commande est pour.

Installation

Plus de ressources Linux

  • Aide-mémoire des commandes Linux
  • Aide-mémoire des commandes Linux avancées
  • Cours en ligne gratuit :Présentation technique de RHEL
  • Aide-mémoire sur le réseau Linux
  • Aide-mémoire SELinux
  • Aide-mémoire sur les commandes courantes de Linux
  • Que sont les conteneurs Linux ?
  • Nos derniers articles Linux

Vous n'avez pas besoin d'installer sort car il est invariablement inclus sur n'importe quel système POSIX. Sur la plupart des systèmes Linux, le sort La commande est regroupée dans une collection d'utilitaires de l'organisation GNU. Sur d'autres systèmes POSIX, tels que BSD et Mac, le sort par défaut La commande n'est pas de GNU, donc certaines options peuvent différer. J'essaierai de rendre compte à la fois des implémentations GNU et BSD dans cet article.

Trier les lignes par ordre alphabétique

Le tri commande, par défaut, regarde le premier caractère de chaque ligne d'un fichier et affiche chaque ligne dans l'ordre alphabétique croissant. Dans le cas où deux caractères sur plusieurs lignes sont identiques, il considère le caractère suivant. Par exemple :

$ cat distro.list
Slackware
Fedora
Red Hat Enterprise Linux
Ubuntu
Arch
1337
Mint
Mageia
Debian
$ sort distro.list
1337
Arch
Debian
Fedora
Mageia
Mint
Red Hat Enterprise Linux
Slackware
Ubuntu

Utilisation du tri ne modifie pas le fichier d'origine. Le tri est un filtre, donc si vous souhaitez conserver vos données sous leur forme triée, vous devez rediriger la sortie en utilisant soit > ou :

$ sort distro.list | tee distro.sorted
1337
Arch
Debian
[...]
$ cat distro.sorted
1337
Arch
Debian
[...]

Trier par colonne

Les ensembles de données complexes doivent parfois être triés par autre chose que la première lettre de chaque ligne. Imaginez, par exemple, une liste d'animaux et l'espèce et le genre de chacun, et chaque "champ" (une "cellule" dans une feuille de calcul) est défini par un caractère délimiteur prévisible. Il s'agit d'un format de données si commun pour les exportations de feuilles de calcul que l'extension de fichier CSV (valeurs séparées par des virgules) existe pour identifier ces fichiers (bien qu'un fichier CSV n'ait pas besoin d'être séparé par des virgules, et qu'un fichier délimité n'ait pas à utiliser le l'extension CSV doit être valide et utilisable). Prenons cet exemple d'ensemble de données :

Aptenodytes;forsteri;Miller,JF;1778;Emperor
Pygoscelis;papua;Wagler;1832;Gentoo
Eudyptula;minor;Bonaparte;1867;Little Blue
Spheniscus;demersus;Brisson;1760;African
Megadyptes;antipodes;Milne-Edwards;1880;Yellow-eyed
Eudyptes;chrysocome;Viellot;1816;Southern Rockhopper
Torvaldis;linux;Ewing,L;1996;Tux

Étant donné cet exemple d'ensemble de données, vous pouvez utiliser le --field-separator (utilisez -t sur BSD et Mac - ou sur GNU pour réduire la frappe) pour définir le caractère de délimitation sur un point-virgule (car cet exemple utilise des points-virgules au lieu de virgules, mais il peut utiliser n'importe quel caractère), et utilisez la touche --key (-k sur BSD et Mac ou sur GNU pour réduire la saisie) option pour définir par quel champ trier. Par exemple, pour trier selon le deuxième champ (commençant à 1 et non à 0) de chaque ligne :

sort --field-separator=";" --key=2
Megadyptes;antipodes;Milne-Edwards;1880;Yellow-eyed
Eudyptes;chrysocome;Viellot;1816;Sothern Rockhopper
Spheniscus;demersus;Brisson;1760;African
Aptenodytes;forsteri;Miller,JF;1778;Emperor
Torvaldis;linux;Ewing,L;1996;Tux
Eudyptula;minor;Bonaparte;1867;Little Blue
Pygoscelis;papua;Wagler;1832;Gentoo

C'est un peu difficile à lire, mais Unix est célèbre pour son pipe méthode de construction de commandes, vous pouvez donc utiliser la colonne commande pour "embellir" la sortie. Utilisation de la colonne GNU :

$ sort --field-separator=";" \
--key=2 penguins.list | \
column --table --separator ";"
Megadyptes   antipodes   Milne-Edwards  1880  Yellow-eyed
Eudyptes     chrysocome  Viellot        1816  Southern Rockhopper
Spheniscus   demersus    Brisson        1760  African
Aptenodytes  forsteri    Miller,JF      1778  Emperor
Torvaldis    linux       Ewing,L        1996  Tux
Eudyptula    minor       Bonaparte      1867  Little Blue
Pygoscelis   papua       Wagler         1832  Gentoo

Légèrement plus énigmatiques pour le nouvel utilisateur (mais plus courtes à saisir), les options de commande sur BSD et Mac :

$ sort -t ";" \
-k2 penguins.list | column -t -s ";"
Megadyptes   antipodes   Milne-Edwards  1880  Yellow-eyed
Eudyptes     chrysocome  Viellot        1816  Southern Rockhopper
Spheniscus   demersus    Brisson        1760  African
Aptenodytes  forsteri    Miller,JF      1778  Emperor
Torvaldis    linux       Ewing,L        1996  Tux
Eudyptula    minor       Bonaparte      1867  Little Blue
Pygoscelis   papua       Wagler         1832  Gentoo

La clé la définition n'a pas besoin d'être définie sur 2 , bien sûr. Tout champ existant peut être utilisé comme clé de tri.

Tri inversé

Vous pouvez inverser l'ordre d'une liste triée avec le --reverse (-r sur BSD ou Mac ou GNU pour plus de brièveté) :

$ sort --reverse alphabet.list
z
y
x
w
[...]

Vous pouvez obtenir le même résultat en canalisant la sortie d'un tri normal via tac.

Trier par mois (GNU uniquement)

Dans un monde parfait, tout le monde écrirait des dates selon la norme ISO 8601 :année, mois, jour. C'est une méthode logique pour spécifier une date unique, et elle est facile à comprendre pour les ordinateurs. Et pourtant, bien souvent, les humains utilisent d'autres moyens d'identifier les dates, y compris des mois avec des noms assez arbitraires.

Heureusement, le GNU sort La commande en tient compte et est capable de trier correctement par nom de mois. Utilisez le --month-sort (-M ) :

$ cat month.list
November
October
September
April
[...]
$ sort --month-sort month.list
January
February
March
April
May
[...]
November
December

Les mois peuvent être identifiés par leur nom complet ou une partie de leur nom.

Tri numérique lisible par l'homme (GNU uniquement)

Un autre point commun de confusion entre les humains et les ordinateurs est les groupes de nombres. Par exemple, les humains écrivent souvent "1024 kilo-octets" comme "1 Ko" car il est plus facile et plus rapide pour le cerveau humain d'analyser "1 Ko" que "1024" (et plus le nombre augmente). Pour un ordinateur, cependant, une chaîne telle que 9 Ko est plus grande que, par exemple, 1 Mo (même si 9 Ko ne représente qu'une fraction de mégaoctet). Le tri GNU La commande fournit le --human-numeric-sort (-h ) option pour aider à analyser ces valeurs correctement.

$ cat sizes.list
2M
12MB
1k
9k
900
7000
$ sort --human-numeric-sort
900
7000
1k
9k
2M
12MB

Il y a quelques incohérences. Par exemple, 16 000 octets sont supérieurs à 1 Ko, mais trier ne reconnaît pas que :

$ cat sizes0.list
2M
12MB
16000
1k
$ sort -h sizes0.list
16000
1k
2M
12MB

Logiquement, 16 000 devrait être écrit 16 Ko dans ce contexte, donc GNU sort n'est pas entièrement à blâmer. Tant que vous êtes sûr que vos chiffres sont cohérents, le --human-numeric-sort peut aider à analyser les nombres lisibles par l'homme d'une manière conviviale pour l'ordinateur.

Tri aléatoire (GNU uniquement)

Parfois, les utilitaires offrent la possibilité de faire le contraire de ce qu'ils sont censés faire. D'une certaine manière, cela n'a aucun sens pour un tri commande pour avoir la possibilité de "trier" un fichier au hasard. Là encore, le flux de travail de la commande en fait une fonctionnalité pratique à avoir. Vous pourriez utilisez une commande différente, comme shuf , ou vous pouvez simplement ajouter une option à la commande que vous utilisez. Qu'il s'agisse de ballonnements ou d'une conception UX ingénieuse, le GNU sort La commande permet de trier arbitrairement un fichier.

La forme la plus pure de tri arbitraire est le --random-sort ou -R option (à ne pas confondre avec l'option -r option, qui est l'abréviation de --reverse ).

$ sort --random-sort alphabet.list
d
m
p
a
[...]

Vous pouvez exécuter un tri aléatoire plusieurs fois sur un fichier pour des résultats différents à chaque fois.

Trié

De nombreuses autres fonctionnalités sont disponibles avec le tri Commandes GNU et BSD, alors prenez le temps de vous familiariser avec les options. Vous serez surpris de la flexibilité du tri peut être, surtout lorsqu'il est combiné avec d'autres utilitaires Unix.


Linux
  1. Travailler avec des flux de données sur la ligne de commande Linux

  2. Faites-en plus en ligne de commande Linux avec GNU Parallel

  3. Travailler avec des canaux sur la ligne de commande Linux

  4. Multi-tâches en ligne de commande avec screenie

  5. Obtenir le complément du résultat d'une commande Ls ?

Commande de tri Linux avec exemples

Apprenez à connaître votre système (en utilisant la ligne de commande)

Maîtrisez la ligne de commande Linux

Manipuler du texte en ligne de commande avec grep

Suivi du temps avec Timewarrior en ligne de commande

Comment contrôler la version avec Git sur la ligne de commande