Commandes Linux

Commande de tri Bash

Commande de tri Bash
Bonne chance pour essayer d'implémenter un algorithme de tri dans bash qui se termine avant demain. Pas de soucis, vous n'en avez pas besoin car vous avez la commande de tri.

Avec le tri, vous pouvez trier les fichiers en fonction de l'ordre dans le dictionnaire ou par valeur numérique, randomiser les lignes de fichier, supprimer les lignes en double et vérifier si un fichier est trié.

Vous pourrez peut-être faire d'autres choses avec, mais d'abord, inquiétons-nous de savoir comment utiliser le tri dans les scripts bash.

Qu'est-ce que le tri?

Sort est une commande externe qui concatène les fichiers tout en triant leur contenu selon un type de tri et écrit les résultats du tri sur la sortie standard.

Options de commande de tri pour bash

La commande de tri est livrée avec 31 options (13 principales et 18 classées comme autres). La programmation bash la plus expérimentée (même les experts) ne connaît que quelques options de tri principales nécessaires pour s'en sortir. Les autres sont rarement touchés. Heureusement pour vous, nous avons le temps de les toucher tous.

Principales options de tri

Ce sont les options qui vous aident à faire avancer les choses et à trier (Tri) en plus de manipuler les résultats triés (Post-traitement) et d'appliquer des filtres (Filtres) avant le tri.

Tri

Sort est livré avec 5 types de tri différents. Voici un tableau montrant chaque type de tri avec les options associées.

Sorte Option courte / option longue / etc
mot
Tri numérique (général) -g / -general-numeric-sort
général-numérique
support pour la notation scientifique
0.1234e4 = 1234
Tri numérique (humain) -h / -humain-numérique-sort
humain-numérique
1.234K = 1234
Numérique -n / -tri-numérique
numérique
… < -1 < 0 < 1 <…
Mois -M / -mois-sort
mois
Inconnu < Jan < Feb <… < Nov < Dec
Aléatoire -r / -tri aléatoire
Aléatoire
Version -V / -version-sort
version

Notez que chaque type de tri a une longue option se terminant par -sort. En plus des options de tri spécifiques, l'option -sort=WORD peut être utilisée pour trier par mot. Par exemple -sort=random peut être utilisé à la place de -random-sort ou -r.

Exemples

Voici quelques exemples de commandes de tri pour chaque méthode de tri.

Exemple) Tri des noms

Le tri n'a aucun problème pour trier les lignes par ordre alphabétique. Considérez une liste de personnes célèbres non triées.

Une fonction

des personnes célèbres()

curl --silencieux https://www.biographieen ligne.net/personnes/célèbres-100.html
| post-contenu grep | sed -e 's/<[^>]*.//g' -e 's/WWII//g' -e 's/\(Wilbur\)
//1 Wright/'| grep -o -e '\(\([A-Z]\+[.]\?\)\+[a-z]*\s\)\+([0-9]\+\s[^)]\+.'

Ligne de commande

célébrités | sorte

Production

Stephen King (1947 - )
Steve Jobs (1955 - 2012)
Piqûre (1951 - )
Tiger Woods (1975 - )
Tom Cruise (1962 - )
Usain Bolt (1986 - )
Vinci (1452 - 1519)
Walt Disney (1901 - 1966)
Wilbur Wright (1867 - 1912)
Woodrow Wilson (1856 - 1924)

Exemple) Tri numérique général

Si nous devons trier des valeurs numériques en prenant en compte une notation scientifique telle que 99e2, nous pouvons utiliser un tri numérique général.

Une fonction

valeurs-numériques-non triées ()

séquence 100 | sort --random-sort | '3i 9e2' | sed '3i 99K'

Considérez la sortie triée en utilisant chaque méthode. Notez qu'en plus de contenir les valeurs 1 à 100, la liste comprend également '9e12' (900) et '99K' (99000).

Ligne de commande

valeurs-numériques non triées | trier -n

Production

96
97
98
99
99K
100

Qu'en est-il 900 et 99000. C'est vrai, c'est juste un tri numérique. Suivant.

Ligne de commande

valeurs-numériques non triées | trier -h

Production

96
97
98
99
100
99K

Qu'en est-il 900. C'est vrai, c'est juste un tri numérique humain. Suivant.

Ligne de commande

valeurs-numériques-non triées | trier -g

Production

96
97
98
99
99K
100
9e2

Qu'en est-il de 99000. C'est vrai, c'est juste un tri numérique général. Comme vous le voyez, aucune méthode de tri n'est compatible dans ce cas ; Cependant, cela ne signifie pas que vous ne pouvez pas trouver de solution.

Ligne de commande

valeurs-numériques non triées | sed 's/[kK]/e3/' | trier -g

Production

96
97
98
99
100
9e2
99e3

Maintenant c'est plus comme ça.

Exemple) Tri numérique humain

Si nous devons trier des valeurs numériques en tenant compte de la signification de notations telles que K, G, M et E, nous pouvons utiliser le tri numérique humain.

Ligne de commande

séquence 100 | sort --random-sort | sed '3i 3k' | trier -h

Production

96
97
98
99
100
3k

Exemple) Tri numérique

Si tout ce dont nous avons besoin est de trier les nombres entiers, le tri numérique fait l'affaire.

Ligne de commande

séquence 100 | sort --random-sort | sort --numerics-sort

Production

95
96
97
98
99
100

Exemple) Tri par mois

Le tri par mois vous permet de trier les lignes par mois. Cela peut s'avérer utile pour regrouper les lignes par mois surtout dans le cas où l'option de tri par heure n'est pas disponible.

Une fonction

mois ()

chat  <Jan
fév
Mar
avr
Mai
juin
juil
août
SEP
oct
nov
déc
FEO

Supposons que les mois ne soient pas triés.

Ligne de commande

mois | sort --random-sort

Production

Mar
oct
déc
avr
Mai
SEP
août
nov
juil
Jan
fév
juin

On peut toujours trier par mois.

Ligne de commande

mois | sort --random-sort | sort --mois-sort

Production

Jan
fév
Mar
avr
Mai
juin
juil
août
SEP
oct
nov
déc

Notez que si nous changeons Dec en n'importe quelle sous-chaîne en novembre, disons "Novem", il apparaîtra après "Nov" dans la sortie triée.

Exemple) Tri aléatoire - tue le terminal de quelqu'un d'autre

Comme prévu, le tri aléatoire fait le contraire du tri, mélange les lignes.

Supposons qu'à des fins éducatives, nous voulions tuer un autre utilisateur. Il faudrait s'assurer que ce n'est pas notre pty et randomiser les listings pour que ce soit plus joli et que l'on puisse dire que les ptys ont été choisis au hasard.

Commandes

message-pty ()


pty local;
pty="$1"
 ;
echo -n "Vous descendez dans" > /dev/$pty;
pour i dans 5 4 3 2 1;
fais
dormir 1 ;
echo -n " ​​$i" > /dev/$pty ;
Fini;
echo " Au revoir!" > /dev/$pty;
dormir 1


ps | grep pty | grep -v -e $( mypty ) | sort --random-sort | tête -1 > stdin;

message-pty $( pty < stdin );
tuer $( pid < stdin )


Sortie dans le terminal de quelqu'un d'autre
Tu descends dans 5 4 3 2 1 Bye!]
(sortir)

Exemple) Tri de version - ips de tri

Comme vous le savez, les fichiers source peuvent être versionnés à l'aide de chaînes telles que 1.0. De plus, les versions peuvent aller plus loin avec des numéros de version comme 1.0.0 comme vu dans les schémas de versions sémantiques populaires.

Le tri de version vous permet de trier les numéros de version. Génial! Maintenant quoi? Testons-le.

Pour cet exemple, j'ai préparé un script bash pour générer des ips aléatoires afin que nous n'ayons pas à y aller. C'est dans le repo. Pour ceux d'entre nous qui n'ont pas le repo, voici un démarrage rapide.

Commandes

git clone https://github.com/temptemp3/linuxhint.com.git
alias random-ips='test -f "linuxhint.com/generate-random-ips.sh" ; bash $_'

Maintenant que vous êtes prêt, commençons.

Ligne de commande

ips aléatoire 200 | tee ips

Production

199.174.177.98
180.33.247.107
87.130.125.109
76.86.8.20
162.41.183.150
226.58.dix.196
83.121.11.145
80.199.197.19
44.214.89.52
185.174.143.111

D'accord, ça marche. Voyons maintenant ce qui se passe lorsque nous essayons de trier les ips.

Ligne de commande

trier les ips

Production

76.88.194.157
8.96.11.181
82.169.213.206
84.218.132.51
84.3.101.97
87.137.131.40
87.59.32.91
89.149.111.242
97.121.162.244
98.145.130.186

À première vue, cela semble fonctionner mais des lignes comme 8.96.11.181 devrait apparaître ailleurs.

Commandes


pour o in d h n V g M
fais
trier ips -$o > ips$o,,
Fini

echo  tous les tris sont égaux à un tri numérique
diff ipsn,d 1>/dev/null || écho ordre du dictionnaire != tri numérique
diff ipsn,h 1>/dev/null || echo tri numérique humain != tri numérique
diff ipsn,g 1>/dev/null || echo tri numérique général != tri numérique
diff ipsn,v 1>/dev/null ||
trier les versions d'écho != tri numérique
show_n_v_ips_diff="true"


test ! "$show_n_v_ips_diff" || diff ipsn,v

Production

toutes sortes de tri numérique égal
ordre du dictionnaire != tri numérique
tri des versions != tri numérique
13,14d12
< 44.221.43.20
< 44.27.108.172
15a14,15
> 44.27.108.172
> 44.221.43.20
27d26
< 84.218.132.51
29c28
< 87.137.131.40

Comme vous le voyez, le tri des versions vous permet de trier les numéros de version lorsque d'autres méthodes de tri échouent.

Exemple) Tri de version - tri des noms de fichiers avec les numéros de version

Sur la base du dernier exemple, utilisons le tri de version un peu plus près de son utilisation prévue. Comme vous le savez, les numéros de version apparaissent généralement dans les noms de fichiers. Voir les détails sur le tri des versions.

Tout d'abord, transformons ips en quelque chose d'autre fichier source de projet comme.

Commandes

alpha ()
alpha="abcdefghijklmnopqrstuvwxyz" ;
echo -n $alpha:$(( RANDOM % 26 )):1

bêta ()
alpha="ab" ;
echo -n $alpha:$(( RANDOM % 2 )):1


chat ip | lors de la lecture de la ligne -r ; fais
echo $(alpha)-v$line$(test $(( RANDOM % 5 )) -eq 0 || bêta).le goudron.gz;
fait | tee gorgées

Production

x-v56.16.109.54.le goudron.gz
k-v117.38.14.165a.le goudron.gz
d-v87.59.32.91a.le goudron.gz
h-v115.215.64.100.le goudron.gz
s-v72.174.246.218b.le goudron.gz
h-v163.93.19.173.le goudron.gz
u-v184.225.11.92b.le goudron.gz
y-v205.53.5.211a.le goudron.gz
t-v175.196.164.17b.le goudron.gz
e-v167.42.221.178b.le goudron.gz
c-v126.54.190.189b.le goudron.gz
b-v169.180.221.131a.le goudron.gz
y-v210.125.170.231a.le goudron.gz
x-v71.56.120.9b.le goudron.gz

Exercer

Faites en sorte que les commandes ci-dessus s'exécutent plus rapidement à l'aide de xargs

Voir l'exemple sur l'utilisation de la commande xargs dans les scripts bash.

Cette fois, nous ne prendrons même pas la peine d'utiliser l'une des autres méthodes de tri.

Ligne de commande

trier -V gorgées

Production

d-v127.100.108.192.le goudron.gz
e-v62.140.229.42a.le goudron.gz
e-v149.77.211.215a.le goudron.gz
e-v167.42.221.178b.le goudron.gz
e-v194.189.236.29a.le goudron.gz
e-v198.145.199.84b.le goudron.gz
e-v240.1.147.196b.le goudron.gz
f-v50.100.142.42b.le goudron.gz
f-v117.58.230.116.le goudron.gz
f-v139.17.210.68b.le goudron.gz
f-v153.18.145.133b.le goudron.gz
g-v201.153.203.60b.le goudron.gz
g-v213.58.67.108.le goudron.gz
h-v5.206.37.224.le goudron.gz

Vous voyez maintenant que le tri de version peut être utile lors du tri des noms de fichiers avec des numéros de version.

Pré-tri

Sort a quatre options principales qui affectent le tri réel, à savoir -ignore-leader-blanks, -ignore-case, -ignore-nonprinting et -dictionary-order, qui peuvent ou non se chevaucher. Exemple utilisant chaque option suivre.

Trier en ignorant les blancs de début

Le tri permet d'ignorer les blancs de début d'entrée en option. Les blancs de tête sont conservés dans la sortie triée.

Option

--ignorer-les-blancs

Usage

sort --ignore-leader-blanks

Commandes

célébrités > fp
chat >> fp << EOF
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)
FEO
chat fp | trier | tac

Production

Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abraham Lincoln (1809 - 1865)
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)

Notez que les espaces de début des lignes ajoutées à fp apparaissent en premier dans la sortie du tri.

Pour résoudre ce problème, nous devons ignorer les blancs de début comme suit.

Commandes

célébrités > fp
chat >> fp << EOF
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)
FEO
chat fp | trier --ignore-leading-blanks --ignore-leading-blanks | tac

Production

Marilyn Monroe (1926 - 1962)
Marilyn Monroe (1926 - 1962)
Marie-Antoinette (1755 - 1793)

Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abraham Lincoln (1809 - 1865)
Abraham Lincoln (1809 - 1865)

Alternatives

chat fp | sed 's/^\s*//' | trier | tac

Notez que l'alternative ne préserve pas les blancs de début dans la sortie de tri.

Trier en ignorant la casse

Le tri permet d'ignorer la casse d'entrée en option. La casse est conservée dans la sortie triée.

Option

--ignorer la casse

Usage

trier --ignore-case

Commandes

célébrités > fp
chat >> fp << EOF
Abraham Lincoln (1809 - 1865)
Abraham Lincoln (1809 - 1865)
FEO
chat fp | trier | tac

Production

Amélie Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abraham Lincoln (1809 - 1865)
Abraham Lincoln (1809 - 1865)

Notez que les espaces de début dans les lignes ajoutées à fp apparaissent en premier dans la sortie du tri.

Pour résoudre ce problème, nous devons ignorer les blancs de début comme suit.

Commandes

célébrités > fp
chat >> fp << EOF
Abraham Lincoln (1809 - 1865)
Abraham Lincoln (1809 - 1865)
FEO
chat fp | trier --ignore-case | tac

Production

Amélie Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abraham Lincoln (1809 - 1865)
Abraham Lincoln (1809 - 1865)
Abraham Lincoln (1809 - 1865)

Alternatives

chat fp | pendant la lecture -r ligne ; faire echo $ligne,, ; fait | trier | tac

Notez que l'alternative ne préserve pas la casse dans la sortie de tri.

Trier en ignorant la non-impression

Le tri permet d'ignorer l'entrée non imprimable en option. La non impression est préservée dans la sortie triée.

Option

--ignorer-non-impression

Usage

sort --ignore-nonprinting

Commandes

célébrités > fp
echo -e "\x90Abe" >> fp
chat fp | trier | tac

Production

Audrey Hepburn (1929 - 1993)
Angelina Jolie (1975 - )
Amélie Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abraham Lincoln (1809 - 1865)

On dirait qu'il nous manque un "Abe" pour les caractères non imprimables dans l'entrée de tri.

Pour résoudre ce problème, nous devons ignorer les caractères non imprimables.

Commandes

célébrités > fp
echo -e "\x90Abe" >> fp
chat fp | sort --ignore-nonprinting | tac
[/cc\
Production
[cc lang="bash"]
Amélie Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abraham Lincoln (1809 - 1865)
Abe

Trier l'ordre du dictionnaire

Le tri permet d'ignorer toutes les entrées, à l'exception des espaces et des caractères alphanumériques en option. L'entrée est conservée dans la sortie triée.

célébrités > fp
echo -e "\x90Abe" >> fp
chat fp | trier --d | tac

Trier les messages

Sort a une option principale qui n'affecte pas le tri, à savoir -reverse. Cependant, cela affecte la sortie, permettant de basculer l'ordre entre ascendant et descendant. Un exemple suit.

Trier la sortie inversée

Le tri permet d'afficher la sortie dans l'ordre inverse en option.

Option

--sens inverse

Usage

trier --reverse

Ligne de commande

célébrités | trier --reverse

Production

Angelina Jolie (1975 - )
Amélie Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abraham Lincoln (1809 - 1865)

Alternatives

trier | tac

Autres options de tri

Il y a vingt-deux autres options de tri. Des exemples suivent.

Trier le chèque

Sort a une option qui vous permet de vérifier si l'entrée est triée. Il retourne après la première instance d'une ligne non triée. Si l'entrée doit être triée mais est probablement déjà en ordre, l'utilisation du contrôle de tri est appropriée.

Option

--Chèque

Usage

trier --vérifier

Ligne de commande

séquence 10 | sort --random-sort | trier --vérifier

Production

tri : -:3 : désordre : 10

Ligne de commande

séquence 10 | sort --random-sort | trier | trier --vérifier

Production

(Vide)

Sortie de tri

Sort a une option qui vous permet de spécifier un fichier dans lequel écrire au lieu d'utiliser la sortie standard ou la redirection. Son utilisation peut améliorer la compatibilité entre les environnements de script.

Option

--sortie=FICHIER

Usage

tri --output=FICHIER

Ligne de commande

séquence 10 | sort --random-sort --output=random-10

Production

(Vide)

Tri nul terminé

Sort a une option qui vous permet de définir le délimiteur de ligne sur null au lieu d'un saut de ligne.

Option

--zéro-terminé

Usage

trier --terminé par zéro

Ligne de commande

séquence 10 | tr '\012' '\000' | sort --terminé par zéro --random-sort

Production

25346178910

Trier stable

Sort a une option qui vous permet de désactiver la comparaison de dernier recours. En conséquence, des temps d'exécution plus stables peuvent être obtenus dans le cas d'entrées suffisamment importantes qui pourraient rendre le tri instable.

Option

--stable

Usage

trier --stable

Ligne de commande

séquence temporelle 1000000 | sort --random-sort | sort --stable >/dev/null

Production

réel    0m9.138s
utilisateur    0m9.201s
sys     0m0.107s

Trier la taille du tampon

Sort a une option qui vous permet de définir la quantité de mémoire utilisée comme tampon lors du tri. Il peut être utilisé pour limiter la consommation de mémoire en triant des entrées plus importantes. Les performances peuvent être affectées.

Option

--buffer-size=TAILLE

Usage

sort --buffer-size=64

Ligne de commande

séquence temporelle 1000000 | trier -trier-aléatoirement | sort -stable -buffer-size=64 >/dev/null

Production

réel    0m21.685s
utilisateur    0m9.858s
sys     0m2.092s

Trier unique

Sort a une option qui vous permet de supprimer les lignes en double dans la sortie de tri

Option

--unique

Usage

trier --unique

Ligne de commande

écho 1 2 2 4 5 | tr '\040' '\000' | sort --terminé par zéro --unique

Production

1245

Alternatives

trier | unique

Conclusion

Sort est une commande externe utile non seulement lorsqu'elle est utilisée en combinaison avec d'autres commandes externes, mais est également pratique lorsqu'elle est utilisée avec des commandes sans méthode de classement intégrée, comme une fonction définie par l'utilisateur ou des scripts bash en général.

Installez le dernier émulateur Dolphin pour Gamecube et Wii sur Linux
L'émulateur Dolphin vous permet de jouer aux jeux Gamecube et Wii de votre choix sur des ordinateurs personnels Linux (PC). Étant un émulateur de jeu...
Comment utiliser le moteur de triche GameConqueror sous Linux
L'article couvre un guide sur l'utilisation du moteur de triche GameConqueror sous Linux. De nombreux utilisateurs qui jouent à des jeux sur Windows u...
Meilleurs émulateurs de console de jeu pour Linux
Cet article répertorie les logiciels d'émulation de console de jeu populaires disponibles pour Linux. L'émulation est une couche de compatibilité logi...