Comenzi Linux

Comanda de sortare Bash

Comanda de sortare Bash
Noroc încercând să implementăm un algoritm de sortare în bash decât se termină înainte de mâine. Nu vă faceți griji, nu aveți nevoie pentru că aveți comanda de sortare.

Cu sortare, puteți comanda fișiere în funcție de ordinea din dicționar sau după valoarea numerică, randomizați liniile de fișiere, eliminați liniile duplicate și verificați dacă un fișier este sortat.

Este posibil să puteți face alte lucruri cu el, dar mai întâi, să ne facem griji cu privire la înfășurarea capului în jurul modului de utilizare a sortării în scripturile bash.

Ce este un fel?

Sortarea este o comandă externă care concatenează fișierele în timp ce le sortează conținutul în funcție de un tip de sortare și scrie rezultatele sortării la ieșirea standard.

Opțiuni de comandă Sortare pentru bash

Comanda de sortare vine cu 31 de opțiuni (13 principale și 18 clasificate ca altele). Cei mai experimentați programări bash (chiar și experți) știu doar câteva opțiuni principale de sortare necesare pentru a trece. Alții sunt rareori atinși. Noroc pentru tine, avem timp să le atingem pe toate.

Opțiuni principale de sortare

Acestea sunt opțiunile care vă ajută să faceți lucrurile și să sortați (Sortare) pe lângă manipularea rezultatelor sortate (Post procesare) și să aplicați filtre (Filtre) înainte de sortare.

Triere

Sortarea vine cu 5 tipuri diferite de sortare. Iată un tabel care arată fiecare tip de sortare cu opțiunile asociate.

Fel Opțiune scurtă / opțiune lungă / etc
cuvânt
Sortare numerică (generală) -g / -general-numeric-sort
general-numeric
sprijin pentru notația științifică
0.1234e4 = 1234
Sortare numerică (umană) -h / -uman-numeric-sort
uman-numeric
1.234K = 1234
Numeric -n / -numeric-sort
numeric
.. < -1 < 0 < 1 <…
Lună -M / -luna-sortare
lună
Necunoscut < Jan < Feb <… < Nov < Dec
Aleatoriu -r / -random-sort
Aleatoriu
Versiune -V / -versiune-sortare
versiune

Rețineți că fiecare tip de sortare are o opțiune lungă care se termină cu -sort. În plus față de opțiunile de sortare specifice, opțiunea -sort = WORD poate fi utilizată pentru a sorta după cuvânt. De exemplu -sort = random poate fi utilizat în locul -random-sort sau -r.

Exemple

Iată câteva exemple de comenzi de sortare pentru fiecare metodă de sortare.

Exemplu) Sortarea numelor

Sortarea nu are probleme la sortarea alfabetică a liniilor. Luați în considerare o listă de oameni celebri nefiind sortați.

Funcţie

oameni faimosi()

curl - silențios https: // www.biografionline.net / people / famous-100.html
| grep post-conținut | sed -e 's /<[^>] *.// g '-e' s / WWII // g '-e' s / \ (Wilbur \)
/ \ 1 Wright / '| grep -o -e '\ (\ ([A-Z] \ + [.] \?\) \ + [a-z] * \ s \) \ + ([0-9] \ + \ s [^)] \+.'

Linie de comanda

celebru-oameni | fel

Ieșire

Stephen King (1947 -)
Steve Jobs (1955 - 2012)
Sting (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)

Exemplu) Sortare numerică generală

Dacă trebuie să sortăm valorile numerice luând în considerare notația științifică, cum ar fi 99e2, putem folosi sortarea numerică generală.

Funcţie

valori-numerice-nesortate ()

sec 100 | sort --random-sort | sed '3i 9e2' | sed '3i 99K'

Luați în considerare ieșirea sortată folosind fiecare metodă. Rețineți că, pe lângă conținerea valorilor de la 1 la 100, lista include și „9e12” (900) și „99K” (99000).

Linie de comanda

valori-numerice-nesortate | sortează -n

Ieșire

96
97
98
99
99K
100

Dar 900 și 99000. Așa este, este doar un fel numeric. Următorul.

Linie de comanda

valori-numerice-nesortate | sortează -h

Ieșire

96
97
98
99
100
99K

Ce zici de 900. Așa este, este doar un fel numeric uman. Următorul.

Linie de comanda

valori-numerice-nesortate | sortează -g

Ieșire

96
97
98
99
99K
100
9e2

Ce zici de 99000. Așa este, este doar un tip numeric general. După cum vedeți, nicio metodă de sortare nu este compatibilă în acest caz; totuși, asta nu înseamnă că nu poți veni cu o soluție.

Linie de comanda

valori-numerice-nesortate | sed 's / [kK] / e3 /' | sortează -g

Ieșire

96
97
98
99
100
9e2
99e3

Acum asta e mai mult.

Exemplu) Sortare numerică umană

Dacă trebuie să sortăm valorile numerice luând în considerare semnificația notațiilor precum K, G, M și E, putem folosi sortarea numerică umană.

Linie de comanda

sec 100 | sort --random-sort | sed '3i 3k' | sortează -h

Ieșire

96
97
98
99
100
3k

Exemplu) Sortare numerică

Dacă tot ce ne trebuie este să sortăm numerele întregi, sortarea numerică face trucul.

Linie de comanda

sec 100 | sort --random-sort | sort - numeric-sort

Ieșire

95
96
97
98
99
100

Exemplu) Sortare lunară

Sortarea lunară vă permite să comandați linii după lună. S-ar putea dovedi util pentru gruparea liniilor în funcție de lună, în special în cazul în care opțiunea de sortare după timp nu este disponibilă.

Funcţie

luni ()

pisică  <Ian
Februarie
Mar
Aprilie
Mai
Iunie
Iul
Aug
Sept
Oct
Noiembrie
Dec
EOF

Să presupunem că lunile nu sunt sortate.

Linie de comanda

luni | sort - sort-sort

Ieșire

Mar
Oct
Dec
Aprilie
Mai
Sept
Aug
Noiembrie
Iul
Ian
Februarie
Iunie

Putem oricând să sortăm după lună.

Linie de comanda

luni | sort --random-sort | sort - lunar-sort

Ieșire

Ian
Februarie
Mar
Aprilie
Mai
Iunie
Iul
Aug
Sept
Oct
Noiembrie
Dec

Rețineți că, dacă schimbăm Dec în orice șir din noiembrie spunem „Novem”, acesta va apărea după „Nov” în ieșirea sortată.

Exemplu) Sortare aleatorie - ucideți terminalul altcuiva

Așa cum era de așteptat, sortarea aleatorie face opusul sortării, amestecă linii.

Să presupunem că, în scop educativ, vrem să ucidem un alt utilizator. Ar trebui să ne asigurăm că nu este pty-ul nostru și să aleatorizăm listele astfel încât să fie mai frumoase și să putem spune că ptys au fost selectate la întâmplare.

Comenzi

mesaj-pty ()


pty local;
pty = "$ 1"
;
echo -n "Te duci în jos"> / dev / $ pty;
pentru i în 5 4 3 2 1;
do
dormi 1;
echo -n "$ i"> / dev / $ pty;
Terminat;
ecou „Pa!"> / dev / $ pty;
dormi 1


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

mesaj-pty $ (pty < stdin );
ucide $ (pid < stdin )


Ieșire în terminalul altcuiva
Vei coborî în 5 4 3 2 1 Pa!]
(Ieșire)

Exemplu) Sortare versiune - sortare ips

După cum știți, fișierele sursă pot fi versionate folosind șiruri precum 1.0. În plus, versiunile pot aprofunda cu numerele de versiune precum 1.0.0, așa cum se vede în schemele de versiuni semantice populare.

Sortarea versiunilor vă permite să sortați numerele de versiune. Grozav! Acum ce? Să testăm.

Pentru acest exemplu, am pregătit un script bash pentru a genera IP-uri aleatorii, astfel încât să nu trebuiască să mergem acolo. Este în repo. Pentru cei dintre noi care nu au repo, iată un început rapid.

Comenzi

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

Acum, că sunteți gata, să începem.

Linie de comanda

random-ips 200 | tee ips

Ieșire

199.174.177.98
180.33.247.107
87.130.125.109
76.86.8.20
162.41.183.150
226.58.10.196
83.121.11.145
80.199.197.19
44.214.89.52
185.174.143.111

Bine, funcționează. Acum să vedem ce se întâmplă atunci când încercăm să sortăm ips-urile.

Linie de comanda

sortare ips

Ieșire

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

La prima vedere, pare să funcționeze, dar linii precum 8.96.11.181 ar trebui să apară în altă parte.

Comenzi


pentru o in d h n V g M
do
sortare ips - $ o> ips $ o ,,
Terminat

ecou toate felurile sortare numerică egală
dif ips n, d 1> / dev / null || ordinea dicționarului ecou != sortare numerică
dif ips n, h 1> / dev / null || ecou sortare numerică umană != sortare numerică
dif ips n, g 1> / dev / null || ecou sortare numerică generală != sortare numerică
dif ips n, v 1> / dev / null ||
sortare versiune ecou != sortare numerică
show_n_v_ips_diff = "adevărat"


Test ! „$ show_n_v_ips_diff” || dif ips n, v

Ieșire

tot felul sortare numerică egală
ordinea dicționarului != sortare numerică
sortare versiune != sortare numerică
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

După cum vedeți, sortarea versiunilor vă permite să sortați numerele de versiune atunci când alte metode de sortare nu reușesc.

Exemplu) Sortare versiune - sortarea numelor de fișiere cu numerele de versiune

Bazându-ne pe ultimul exemplu, să folosim versiunea sortată puțin mai aproape de utilizarea intenționată. După cum știți, numerele de versiune apar de obicei în numele fișierelor. Vedeți Detalii despre sortarea versiunilor.

În primul rând, să transformăm ips-urile în altceva mai mult ca fișier sursă de proiect.

Comenzi

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

beta ()
alfa = "ab";
echo -n $ alfa: $ ((RANDOM% 2)): 1


cat ips | în timp ce citiți -r linie; do
echo $ (alfa) -v $ line $ (test $ ((RANDOM% 5)) -eq 0 || beta).gudron.gz;
gata | tee sips

Ieșire

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

Exercițiu

Faceți comenzile de mai sus să ruleze mai repede folosind xargs

Vedeți exemplul de utilizare a comenzii xargs în scripturile bash.

De data aceasta, nici măcar nu ne vom deranja să folosim oricare dintre celelalte metode de sortare.

Linie de comanda

sortează -V înghițituri

Ieșire

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

Acum vedeți că sortarea versiunii poate fi utilă atunci când sortați numele fișierelor cu numere de versiune.

Pre sortare

Sortarea are patru opțiuni principale care afectează sortarea reală și anume -ignore-leading-blanks, -ignore-case, -ignore-nonprinting și -diction-order, care se pot suprapune sau nu. Exemplu care folosește fiecare opțiune.

Sortați ignorând semifabricatele

Sortarea permite ca elementele goale de intrare să fie ignorate ca opțiune. Semifabricatele principale sunt păstrate în ieșirea sortată.

Opțiune

--ignora-conducând-golurile

Utilizare

sortează --ignore-leading-blanks

Comenzi

celebru-oameni> fp
pisica >> fp << EOF
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)
EOF
cat fp | sortare | tac

Ieșire

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

Rețineți că spațiile de conducere din liniile adăugate la fp apar mai întâi în ieșirea de sortare.

Pentru a remedia acest lucru, trebuie să ignorăm semifabricatele de mai jos, după cum urmează.

Comenzi

celebru-oameni> fp
pisica >> fp << EOF
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)
EOF
cat fp | sortare --ignore-leading-blanks --ignore-leading-blanks | tac

Ieșire

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)

Alternative

cat fp | sed 's / ^ \ s * //' | sortare | tac

Rețineți că alternativa nu păstrează semifabricatele inițiale în rezultatul sortării.

Sortați ignorând majuscule

Sortarea permite ca casele de intrare să fie ignorate ca opțiune. Carcasa este păstrată în ieșirea sortată.

Opțiune

--ignorare-caz

Utilizare

sortează --ignore-case

Comenzi

celebru-oameni> fp
pisica >> fp << EOF
Abraham Lincoln (1809-1865)
Abraham Lincoln (1809 - 1865)
EOF
cat fp | sortare | tac

Ieșire

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

Rețineți că spațiile de direcție din liniile adăugate la fp apar mai întâi în ieșirea de sortare.

Pentru a remedia acest lucru, trebuie să ignorăm semifabricatele de bază, după cum urmează.

Comenzi

celebru-oameni> fp
pisica >> fp << EOF
Abraham Lincoln (1809 - 1865)
Abraham Lincoln (1809 - 1865)
EOF
pisică fp | sort --ignore-case | tac

Ieșire

Amelia 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)

Alternative

cat fp | în timp ce citiți -r linie; ecou $ line ,,; gata | sortare | tac

Rețineți că alternativa nu păstrează majuscule și minuscule în sortare.

Sortați ignorând neimprimarea

Sortarea permite ignorarea intrării pentru a fi ignorată ca opțiune. Neimprimarea este păstrată în ieșirea sortată.

Opțiune

--ignorați-neimprimarea

Utilizare

sortare --ignore-nonprinting

Comenzi

celebru-oameni> fp
echo -e "\ x90Abe" >> fp
pisică fp | sortare | tac

Ieșire

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

Se pare că ne lipsește un „Abe” pentru caracterele care nu se tipăresc în introducerea sortării.

Pentru a remedia acest lucru, trebuie să ignorăm caracterele care nu se tipăresc.

Comenzi

celebru-oameni> fp
echo -e "\ x90Abe" >> fp
cat fp | sort --ignore-nonprinting | tac
[/ cc \
Ieșire
[cc lang = "bash"]
Amelia Earhart (1897-1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)
▒Abe

Sortați ordinea dicționarului

Sortare permite ca toate intrările să fie ignorate, cu excepția spațiilor și a caracterelor alfanumerice ca opțiune. Intrarea este păstrată în ieșirea sortată.

celebru-oameni> fp
echo -e "\ x90Abe" >> fp
pisică fp | sortează --d | tac

Postează sortarea

Sortarea are o opțiune principală care nu afectează sortarea și anume -reversa. Cu toate acestea, afectează ieșirea, permițând comutarea ordinii între ascendent și descendent. Urmează un exemplu.

Sortează ieșirea inversă

Sortare permite ca ieșirea să fie afișată în ordine inversă ca opțiune.

Opțiune

--verso

Utilizare

sort - invers

Linie de comanda

celebru-oameni | sort - invers

Ieșire

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

Alternative

sortare | tac

Alte opțiuni pentru sortare

Există alte douăzeci și două de opțiuni pentru sortare. Urmează exemple.

Verificați sortarea

Sortare are o opțiune care vă permite să verificați dacă intrarea este sortată. Revine după prima instanță a unei linii nesortate. În cazul în care intrarea trebuie să fie sortată, dar este probabil deja în ordine, folosind verificarea sortării este adecvată.

Opțiune

--Verifica

Utilizare

sortează - verifică

Linie de comanda

sec. 10 | sort --random-sort | sortează - verifică

Ieșire

sortare: -: 3: tulburare: 10

Linie de comanda

sec. 10 | sort --random-sort | sortare | sortează - verifică

Ieșire

(gol)

Sortează ieșirea

Sortare are o opțiune care vă permite să specificați un fișier în care să scrieți în loc să utilizați ieșirea standard sau redirecționarea. Utilizarea acestuia poate îmbunătăți compatibilitatea între mediile de scriptare.

Opțiune

--output = FILE

Utilizare

sort --output = FILE

Linie de comanda

sec. 10 | sort --random-sort --output = random-10

Ieșire

(gol)

Sortare nulă terminată

Sortare are o opțiune care vă permite să setați delimitatorul de linie la nul în locul unei linii noi.

Opțiune

--terminat zero

Utilizare

sortare - terminat zero

Linie de comanda

sec. 10 | tr '\ 012' '\ 000' | sort - zero-terminated --random-sort

Ieșire

25346178910

Sortează stabil

Sortare are o opțiune care vă permite să dezactivați comparația de ultimă instanță. Ca rezultat, se pot obține durate de rulare mai stabile în cazul unor intrări suficient de mari care ar putea face ca sortarea să funcționeze instabil.

Opțiune

--grajd

Utilizare

sort - stabil

Linie de comanda

timp sec 1000000 | sort --random-sort | sort --stable> / dev / null

Ieșire

0m9 real.138s
utilizator 0m9.Anii 201
sys 0m0.Anii 107

Sortați dimensiunea bufferului

Sortare are o opțiune care vă permite să setați cantitatea de memorie utilizată ca tampon în timpul sortării. Poate fi folosit pentru a limita consumul de memorie sortând intrări mai mari. Performanța poate fi afectată.

Opțiune

--buffer-size = SIZE

Utilizare

sort - buffer-size = 64

Linie de comanda

timp sec 1000000 | sort -random-sort | sort -stable -buffer-size = 64> / dev / null

Ieșire

0m21 real.685s
utilizator 0m9.858s
sys 0m2.092s

Sortează unic

Sortare are o opțiune care vă permite să eliminați liniile duplicate din ieșirea de sortare

Opțiune

--unic

Utilizare

sort - unic

Linie de comanda

ecou 1 2 2 4 5 | tr '\ 040' '\ 000' | sort - zero-terminated --unique

Ieșire

1245

Alternative

sortare | uniq

Concluzie

Sortarea este o comandă externă utilă nu numai atunci când este utilizată în combinație cu alte comenzi externe, dar este utilă și atunci când este utilizată cu comenzi fără metodă de ordonare încorporată, cum ar fi o funcție definită de utilizator sau scripturi bash în general.

SuperTuxKart for Linux
SuperTuxKart is a great title designed to bring you the Mario Kart experience free of charge on your Linux system. It is pretty challenging and fun to...
Battle for Wesnoth Tutorial
The Battle for Wesnoth is one of the most popular open source strategy games that you can play at this time. Not only has this game been in developmen...
0 A.D. Tutorial
Out of the many strategy games out there, 0 A.D. manages to stand out as a comprehensive title and a very deep, tactical game despite being open sourc...