Pomocou zoradenia môžete súbory zoradiť na základe poradia v slovníku alebo podľa číselných hodnôt, náhodne rozdeliť riadky súborov, odstrániť duplicitné riadky a skontrolovať, či je súbor zoradený.
Možno s tým budete môcť robiť aj iné veci, ale najskôr si urobme starosti s tým, ako zabalíme hlavu okolo toho, ako používať triedenie v bash skriptoch.
Čo je druh?
Zoradiť je externý príkaz, ktorý zreťazí súbory pri triedení ich obsahu podľa typu zoradenia a zapíše výsledky triedenia na štandardný výstup.
Možnosti príkazu na zoradenie pre bash
Príkaz zoradenia obsahuje 31 možností (13 hlavných a 18 kategorizovaných ako iné). Najskúsenejšie programovanie v bashe (dokonca aj odborníci) poznajú iba niekoľko hlavných možností triedenia, ktoré sú potrebné na zvládnutie. Ostatných sa to dotýka málokedy. Našťastie pre vás máme čas dotknúť sa ich všetkých.
Hlavné možnosti triedenia
Toto sú možnosti, ktoré vám pomôžu dokončiť prácu a triediť (Triedenie), okrem toho môžete manipulovať so zoradenými výsledkami (Následné spracovanie) a pred triedením použiť filtre (Filtre).
Triedenie
Triedenie sa dodáva s 5 rôznymi typmi triedenia. Tu je tabuľka zobrazujúca každý typ zoradenia s príslušnými možnosťami.
Triediť | Krátka možnosť / dlhá možnosť / atď slovo |
Numerické triedenie (všeobecné) | -g / -general-numeric-sort všeobecno-číselné podpora vedeckej notácie 0.1234e4 = 1234 |
Numerické triedenie (ľudské) | -h / -ľudsko-numerické triedenie ľudsko-číselný 1.234K = 1234 |
Numerické | -n / -číselné triedenie číselný … < -1 < 0 < 1 <… |
Mesiac | -M / -mesačné triedenie mesiac Neznáme < Jan < Feb <… < Nov < Dec |
Náhodné | -r / -random-sort náhodný |
Verzia | -V / -version-sort verzia |
Upozorňujeme, že každý typ zoradenia má dlhú možnosť končiacu -sort. Okrem špecifických možností zoradenia sa na triedenie podľa slov môže použiť voľba -sort = WORD. Napríklad -sort = random sa môže použiť namiesto -random-sort alebo -r.
Príklady
Tu je niekoľko príkladov príkazov na triedenie pre každú metódu triedenia.
Príklad) Triedenie mien
Triedenie nemá problémy s abecedným radením riadkov. Zvážte zoznam známych ľudí, ktorí nie sú zoradení.
Funkcia
slávni ľudia()zvlnenie - tiché https: // www.biografia online.net / people / famous-100.html
| grep post-obsah | sed -e '/<[^>] *.// g '-e' s / WWII // g '-e' s / \ (Wilbur \)
/ \ 1 Wright / '| grep -o -e '\ (\ ([A-Z] \ + [.] \?\) \ + [a-z] * \ s \) \ + ([0-9] \ + \ s [^)] \+.„
Príkazový riadok
slávni ľudia | triediťVýkon
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)
Príklad) Všeobecné číselné triedenie
Ak potrebujeme triediť číselné hodnoty, pričom zohľadníme vedecký zápis, ako je napríklad 99e2, môžeme použiť všeobecné číselné triedenie.
Funkcia
unsorted-numeric-values ()seq 100 | triediť --random-triediť | sed '3i 9e2' | sed '3i 99K'
Zvážte zoradený výstup pomocou každej metódy. Upozorňujeme, že okrem toho, že obsahuje hodnoty 1 až 100, zoznam obsahuje aj „9e12“ (900) a „99K“ (99000).
Príkazový riadok
netriedené číselné hodnoty | triediť -nVýkon
9697
98
99
99 tis
100
Čo tak 900 a 99000. Správne, je to len číselné triedenie. Ďalšie.
Príkazový riadok
netriedené číselné hodnoty | triediť -hVýkon
9697
98
99
100
99 tis
Čo tak 900. Máte pravdu, je to len ľudský číselný druh. Ďalšie.
Príkazový riadok
netriedené číselné hodnoty | triediť -gVýkon
9697
98
99
99 tis
100
9e2
A čo 99 000. Máte pravdu, ide iba o všeobecné numerické triedenie. Ako vidíte, v tomto prípade nie je kompatibilná žiadna metóda triedenia; To však neznamená, že nemôžete prísť s opravou.
Príkazový riadok
netriedené číselné hodnoty | sed 's / [kK] / e3 /' | triediť -gVýkon
9697
98
99
100
9e2
99e3
Teraz je to viac podobné.
Príklad) Ľudské numerické triedenie
Ak potrebujeme triediť číselné hodnoty a brať do úvahy význam zápisov ako K, G, M a E, môžeme použiť ľudské číselné triedenie.
Príkazový riadok
seq 100 | triediť --random-triediť | sed '3i 3k' | triediť -hVýkon
9697
98
99
100
3k
Príklad) Numerické triedenie
Ak všetko, čo potrebujeme, je zoradiť celé čísla, numerické triedenie je trik.
Príkazový riadok
seq 100 | triediť --random-triediť | sort --numerics-sortVýkon
9596
97
98
99
100
Príklad) Mesačné triedenie
Zoradenie podľa mesiaca umožňuje zoradiť riadky podľa mesiaca. Môže sa ukázať ako užitočné na zoskupovanie riadkov podľa mesiaca, najmä v prípade, že nie je k dispozícii možnosť triedenia podľa času.
Funkcia
mesiace ()kat <
Február
Mar
Apr
Smieť
Jún
Jul
Aug
Sept
Okt
Nov
Dec
EOF
Predpokladajme, že to nie sú mesiace.
Príkazový riadok
mesiace | triediť --random-triediťVýkon
MarOkt
Dec
Apr
Smieť
Sept
Aug
Nov
Jul
Jan
Február
Jún
Vždy môžeme triediť podľa mesiaca.
Príkazový riadok
mesiace | triediť --random-triediť | triediť - mesiac-triediťVýkon
JanFebruár
Mar
Apr
Smieť
Jún
Jul
Aug
Sept
Okt
Nov
Dec
Upozorňujeme, že ak v novembri zmeníme Dec na akýkoľvek podreťazec, ktorý bude obsahovať slovo „Novem“, v zoradenom výstupe sa objaví po znaku „Nov“.
Príklad) Náhodné triedenie - zabite terminál niekoho iného
Náhodné triedenie podľa očakávaní robí opak triedenia, zmieša riadky.
Predpokladajme, že na účely vzdelávania chceme zabiť iného používateľa. Museli by sme sa uistiť, že to nie je naša položka, a náhodne zaradiť zoznamy, aby to bolo krajšie a aby sme mohli povedať, že body boli vybrané náhodne.
Príkazy
message-pty ()miestne pty;
pty = "$ 1"
;
echo -n "Chystáte sa dolu"> / dev / $ pty;
pre i v 5 4 3 2 1;
robiť
spať 1;
echo -n "$ i"> / dev / $ pty;
hotový;
ozvena „Ahoj!"> / dev / $ pty;
spať 1
ps | grep pty | grep -v -e $ (mypty) | triediť --random-triediť | hlava -1> stdin;
message-pty $ (pty < stdin );
zabiť $ (pid < stdin )
Výstup v termináli niekoho iného
Zostávaš dole o 5 4 3 2 1 Ahoj!]
(východ)
Príklad) Zoradenie verzie - triedenie ips
Ako viete, zdrojové súbory môžu byť verziované pomocou reťazcov ako napríklad 1.0. Verzie navyše môžu ísť s číslami verzií ako 1 hlbšie.0.0, aké sú viditeľné v populárnych schémach sémantickej verzie.
Zoradenie verzií umožňuje zoradiť čísla verzií. Skvelé! Teraz čo? Poďme to vyskúšať.
Pre tento príklad som pripravil bash skript na generovanie náhodných ips, aby sme tam nemuseli chodiť. Je to v repu. Pre tých z nás, ktorí nemajú repo, je tu rýchly štart.
Príkazy
git klon https: // github.com / temptemp3 / linuxhint.com.gitalias random-ips = 'test -f "linuxhint.com / generate-random-ips.sh "; bash $ _ '
Teraz, keď ste pripravení, začnime.
Príkazový riadok
random-ips 200 | tee ipsVýkon
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
Dobre, funguje to. Teraz sa pozrime, čo sa stane, keď sa pokúsime triediť ips.
Príkazový riadok
triediť ipsVýkon
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
Na prvý pohľad sa zdá, že funguje, ale riadky ako 8.96.11.181 by sa malo objaviť inde.
Príkazy
pre o v d h n V g M
robiť
zoradiť ips - $ o> ips $ o ,,
hotový
echo všetky druhy rovnaké numerické triedenie
diff ips n, d 1> / dev / null || poradie slovníka ozveny != číselné triedenie
diff ips n, h 1> / dev / null || echo ľudský číselný druh != číselné triedenie
diff ips n, g 1> / dev / null || echo všeobecné numerické triedenie != číselné triedenie
diff ips n, v 1> / dev / null ||
triedenie echo verzie != číselné triedenie
show_n_v_ips_diff = "true"
test ! "$ show_n_v_ips_diff" || rozdiel ips n, v
Výkon
všetky druhy rovnaké numerické triedenieslovníkový poriadok != číselné triedenie
verzia triediť != číselné triedenie
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
Ako vidíte, triedenie verzií vám umožňuje triediť čísla verzií, keď zlyhajú iné spôsoby triedenia.
Príklad) Zoradenie verzie - triedenie názvov súborov s číslami verzií
Na základe posledného príkladu použijeme triedenie verzií trochu bližšie k zamýšľanému použitiu. Ako viete, čísla verzií sa bežne vyskytujú v názvoch súborov. Prečítajte si podrobnosti o triedení verzií.
Najskôr poďme transformovať ips na niečo iné, ako je zdrojový súbor projektu.
Príkazy
alfa ()alpha = "abcdefghijklmnopqrstuvwxyz";
echo -n $ alpha: $ ((RANDOM% 26)): 1
beta ()
alfa = "ab";
echo -n $ alpha: $ ((RANDOM% 2)): 1
mačacie ips | pri načítaní -r riadok; robiť
echo $ (alpha) -v $ line $ (test $ ((RANDOM% 5)) -eq 0 || beta).decht.gz;
hotovo | tee dúšky
Výkon
x-v56.16.109.54.decht.gzk-v117.38.14.165a.decht.gz
d-v87.59.32.91a.decht.gz
h-v115.215.64.100.decht.gz
s-v72.174.246.218b.decht.gz
h-v163.93.19.173.decht.gz
u-v184.225.11.92b.decht.gz
y-v205.53.5.211a.decht.gz
t-v175.196.164.17b.decht.gz
e-v167.42.221.178b.decht.gz
c-v126.54.190.189b.decht.gz
b-v169.180.221.131a.decht.gz
y-v210.125.170.231a.decht.gz
x-v71.56.120.9b.decht.gz
Cvičenie
Zabezpečte, aby vyššie uvedené príkazy bežali rýchlejšie pomocou xargs
Pozrite si príklad, ako používať príkaz xargs v skriptoch bash.
Tentokrát sa nebudeme obťažovať ani použitím žiadnej z ďalších metód triedenia.
Príkazový riadok
triediť -V dúškochVýkon
d-v127.100.108.192.decht.gze-v62.140.229.42a.decht.gz
e-v149.77.211.215a.decht.gz
e-v167.42.221.178b.decht.gz
e-v194.189.236.29a.decht.gz
e-v198.145.199.84b.decht.gz
e-v240.1.147.196b.decht.gz
f-v50.100.142.42b.decht.gz
f-v117.58.230.116.decht.gz
f-v139.17.210.68b.decht.gz
f-v153.18.145.133b.decht.gz
g-v201.153.203.60b.decht.gz
g-v213.58.67.108.decht.gz
h-v5.206.37.224.decht.gz
Teraz vidíte, že triedenie verzií môže byť užitočné pri triedení názvov súborov s číslami verzií.
Predtriediť
Zoradenie má štyri hlavné možnosti, ktoré ovplyvňujú skutočné triedenie, a to: -ignore-leader-blank, -ignore-case, -ignore-nonprinting a -dictionary-order, ktoré sa môžu alebo nemusia prekrývať. Nasleduje príklad použitia každej možnosti.
Triedenie ignoruje úvodné medzery
Zoradenie umožňuje voliteľne ignorovať vstupné medzery. V triedenom výstupe sú zachované úvodné medzery.
Možnosť
--ignorovať vedúce medzeryVyužitie
triediť - prázdne miesta vedúcehoignoraPríkazy
slávni ľudia> fpmačka >> fp << EOF
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)
EOF
mačka fp | triediť | tac
Výkon
Alfred Hitchcock (1899 - 1980)Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)
Všimnite si, že úvodné medzery v riadkoch pridaných do fp sa objavujú ako prvé vo výstupe triedenia.
Aby sme to napravili, musíme ignorovať úvodné medzery nasledovne.
Príkazy
slávni ľudia> fpmačka >> fp << EOF
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)
EOF
mačka fp | triediť --ignore-leading-blanks --ignore-leader-blanks | tac
Výkon
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)
Alternatívy
mačka fp | sed 's / ^ \ s * //' | triediť | tacUpozorňujeme, že alternatíva nezachová úvodné medzery vo výstupe zoradenia.
Zoradiť ignorovanie veľkých a malých písmen
Zoradenie umožňuje voliteľne ignorovať veľké a malé písmená. Prípad sa v triedenom výstupe zachová.
Možnosť
--prípad ignorovaťVyužitie
triediť --ignore-casePríkazy
slávni ľudia> fpmačka >> fp << EOF
Abraham Lincoln (1809 - 1865)
ABraham Lincoln (1809 - 1865)
EOF
mačka fp | triediť | tac
Výkon
Amelia Earhart (1897 - 1937)Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)
ABraham Lincoln (1809 - 1865)
Všimnite si, že úvodné medzery v riadkoch pridaných do fp sa objavujú ako prvé vo výstupe triedenia.
Aby sme to napravili, musíme ignorovať úvodné medzery nasledovne.
Príkazy
slávni ľudia> fpmačka >> fp << EOF
Abraham Lincoln (1809 - 1865)
ABraham Lincoln (1809 - 1865)
EOF
mačka fp | triediť --ignore-case | tac
Výkon
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)
Alternatívy
mačka fp | pri načítaní -r riadok; do echo $ line ,,; hotovo | triediť | tacUpozorňujeme, že alternatíva nezachováva veľkosť písmen vo výstupe zoradenia.
Triedenie ignoruje netlač
Zoradenie umožňuje ako voľbu ignorovať netlačiaci vstup. Nepotlač sa zachová v triedenom výstupe.
Možnosť
--ignorovať-netlačiťVyužitie
triediť --ignore-netlačPríkazy
slávni ľudia> fpecho -e "\ x90Abe" >> fp
mačka fp | triediť | tac
Výkon
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)
Zdá sa, že nám chýba „Abé“ na netlačiace znaky v zadaní triedenia.
Aby sme to napravili, musíme ignorovať netlačiace znaky.
Príkazy
slávni ľudia> fpecho -e "\ x90Abe" >> fp
mačka fp | triediť --ignore-netlač | tac
[/ cc \
Výkon
[cc lang = "bash"]
Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)
BeAbe
Zoradiť poradie slovníka
Zoradenie umožňuje ignorovať všetky vstupy, s výnimkou medzier a alfanumerických znakov. Vstup sa zachová v zoradenom výstupe.
slávni ľudia> fpecho -e "\ x90Abe" >> fp
mačka fp | triediť --d | tac
Zoradiť príspevok
Zoradenie má jednu hlavnú možnosť, ktorá neovplyvňuje triedenie, a to, - naopak. Ovplyvňuje to však výstup, čo umožňuje prepínanie medzi stúpaním a klesaním. Nasleduje príklad.
Triediť spätný výstup
Zoradenie umožňuje voliteľne zobraziť výstup v opačnom poradí.
Možnosť
--obrátiťVyužitie
triediť - spätnePríkazový riadok
slávni ľudia | triediť - spätneVýkon
Angelina Jolie (1975 -)Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)
Alternatívy
triediť | tacĎalšie možnosti triedenia
Existuje 22 ďalších možností triedenia. Nasledujú príklady.
Kontrola triedenia
Zoradiť má možnosť, ktorá vám umožní skontrolovať, či je vstup zoradený. Vráti sa po prvej inštancii netriedeného riadku. V prípade, že sa vyžaduje triedenie vstupu, ale je to pravdepodobne už v poriadku, je vhodné použiť kontrolu triedenia.
Možnosť
--skontrolovaťVyužitie
triediť - skontrolovaťPríkazový riadok
nasl. 10 | triediť --random-triediť | triediť - skontrolovaťVýkon
druh: -: 3: porucha: 10Príkazový riadok
nasl. 10 | triediť --random-triediť | triediť | triediť - skontrolovaťVýkon
(prázdne)Zoradiť výstup
Triedenie má možnosť, ktorá vám umožňuje určiť súbor, do ktorého sa má zapísať, namiesto použitia štandardného výstupu alebo presmerovania. Jeho použitie môže zlepšiť kompatibilitu v skriptovacích prostrediach.
Možnosť
--výstup = SÚBORVyužitie
sort --output = SÚBORPríkazový riadok
nasl. 10 | sort --random-sort --output = random-10Výkon
(prázdne)Triedenie je ukončené
Zoradenie má možnosť, ktorá vám umožní nastaviť oddeľovač riadkov na nulu namiesto nového riadku.
Možnosť
--s nulovým zakončenímVyužitie
triediť - s nulovým zakončenímPríkazový riadok
nasl. 10 | tr '\ 012' '\ 000' | triediť --znovu zakončené --random-triediťVýkon
25346178910Triediť stabilne
Triedenie má možnosť, ktorá umožňuje zakázať porovnanie poslednej inštancie. Vďaka tomu je možné dosiahnuť stabilnejšie prevádzkové časy v prípade dostatočne veľkých vstupov, ktoré by mohli spôsobiť nestabilitu fungovania druhu.
Možnosť
--stabilnýVyužitie
triediť - stabilnePríkazový riadok
časové obdobie 10 000 000 | triediť --random-triediť | triediť - stabilne> / dev / nullVýkon
skutočných 0m9.138-te rokypoužívateľ 0m9.201. roky
sys 0m0.107. roky
Zoradiť veľkosť vyrovnávacej pamäte
Triedenie má možnosť, ktorá vám umožňuje nastaviť množstvo pamäte použitej ako vyrovnávacia pamäť pri triedení. Môže sa použiť na obmedzenie spotreby pamäte pri triedení väčších vstupov. Môže to mať vplyv na výkon.
Možnosť
--veľkosť vyrovnávacej pamäte = SIZEVyužitie
sort --buffer-size = 64Príkazový riadok
časové obdobie 10 000 000 | triediť -nahodovať-triediť | sort -stable -buffer-size = 64> / dev / null
Výkon
skutočných 0m21.685spoužívateľ 0m9.858-te roky
sys 0m2.092s
Triediť jedinečne
Zoradenie má možnosť, ktorá vám umožňuje odstrániť duplicitné riadky vo výstupe triedenia
Možnosť
--jedinečnýVyužitie
triediť - jedinečnéPríkazový riadok ozvena 1 2 2 4 5 | tr '\ 040' '\ 000' | triediť - s nulovým zakončením - jedinečné
Výkon
1245Alternatívy
triediť | uniqZáver
Zoradiť je externý príkaz, ktorý je užitočný nielen pri použití v kombinácii s inými externými príkazmi, ale tiež sa hodí pri použití s príkazmi bez zabudovanej metódy objednávania, ako sú napríklad používateľom definované funkcie alebo základné skripty.