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 | felIeș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ă -nIeșire
9697
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ă -hIeșire
9697
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ă -gIeșire
9697
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ă -gIeșire
9697
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ă -hIeșire
9697
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-sortIeșire
9596
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ă <
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-sortIeșire
MarOct
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-sortIeșire
IanFebruarie
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.gitalias 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 ipsIeșire
199.174.177.98180.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 ipsIeșire
76.88.194.1578.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.gzk-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țituriIeșire
d-v127.100.108.192.gudron.gze-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-golurileUtilizare
sortează --ignore-leading-blanksComenzi
celebru-oameni> fppisica >> 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> fppisica >> 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 | tacReț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-cazUtilizare
sortează --ignore-caseComenzi
celebru-oameni> fppisica >> 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> fppisica >> 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 | tacReț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-neimprimareaUtilizare
sortare --ignore-nonprintingComenzi
celebru-oameni> fpecho -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> fpecho -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> fpecho -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
--versoUtilizare
sort - inversLinie de comanda
celebru-oameni | sort - inversIeș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 | tacAlte 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
--VerificaUtilizare
sortează - verificăLinie de comanda
sec. 10 | sort --random-sort | sortează - verificăIeșire
sortare: -: 3: tulburare: 10Linie 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 = FILEUtilizare
sort --output = FILELinie de comanda
sec. 10 | sort --random-sort --output = random-10Ieș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 zeroUtilizare
sortare - terminat zeroLinie de comanda
sec. 10 | tr '\ 012' '\ 000' | sort - zero-terminated --random-sortIeșire
25346178910Sortează 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
--grajdUtilizare
sort - stabilLinie de comanda
timp sec 1000000 | sort --random-sort | sort --stable> / dev / nullIeșire
0m9 real.138sutilizator 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 = SIZEUtilizare
sort - buffer-size = 64Linie de comanda
timp sec 1000000 | sort -random-sort | sort -stable -buffer-size = 64> / dev / null
Ieșire
0m21 real.685sutilizator 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
--unicUtilizare
sort - unicLinie de comanda ecou 1 2 2 4 5 | tr '\ 040' '\ 000' | sort - zero-terminated --unique
Ieșire
1245Alternative
sortare | uniqConcluzie
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.