Pomocí třídění můžete soubory řadit podle pořadí ve slovníku nebo podle číselné hodnoty, náhodně řadit soubory, odstranit duplicitní řádky a zkontrolovat, zda je soubor seřazen.
Možná s tím budete moci dělat i jiné věci, ale nejdřív si udělejte starosti s tím, jak zabalit hlavu kolem toho, jak používat řazení v bash skriptech.
Co je druh?
Sort je externí příkaz, který spojuje soubory při třídění jejich obsahu podle typu třídění a zapisuje výsledky třídění na standardní výstup.
Možnosti příkazu řazení pro bash
Příkaz řazení má 31 možností (13 hlavních a 18 kategorizovaných jako jiné). Nejzkušenější programování v bash (dokonce i odborníci) vědí jen několik hlavních možností třídění, které je potřeba zvládnout. Jiných se to dotýká jen zřídka. Naštěstí pro vás máme čas se jich všech dotknout.
Hlavní možnosti řazení
Toto jsou možnosti, které vám pomohou dokončit práci a třídit (třídění), kromě manipulace s tříděnými výsledky (následné zpracování) a použití filtrů (filtrů) před tříděním.
Třídění
Třídění je dodáváno s 5 různými typy třídění. Zde je tabulka zobrazující každý typ řazení s přidruženými možnostmi.
Třídit | Krátká volba / dlouhá volba / atd slovo |
Numerické řazení (obecně) | -g / -general-numeric-sort obecný-číselný podpora vědecké notace 0.1234e4 = 1234 |
Numerické řazení (lidské) | -h / -lidsko-číselné třídění lidsko-číselné 1.234K = 1234 |
Číselné | -n / -číselné třídění číselný … < -1 < 0 < 1 <… |
Měsíc | -M / -měsíc měsíce Měsíc Neznámý < Jan < Feb <… < Nov < Dec |
Náhodný | -r / -random-sort náhodný |
Verze | -V / -version-sort verze |
Všimněte si, že každý typ řazení má dlouhou možnost končící na -sort. Kromě konkrétních možností řazení lze k třídění podle slov použít volbu -sort = WORD. Například -sort = random lze použít místo -random-sort nebo -r.
Příklady
Zde je několik příkladů příkazu řazení pro každou metodu řazení.
Příklad) Třídění jmen
Řazení nemá problémy s řazením řádků podle abecedy. Zvažte seznam slavných lidí, kteří nejsou seřazeni.
Funkce
slavní lidé()curl --silent https: // www.biografie 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 [^)] \+.''
Příkazový řádek
slavní lidé | tříditVýstup
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)
Příklad) Obecné číselné řazení
Pokud potřebujeme seřadit číselné hodnoty, vezmeme-li v úvahu vědeckou notaci, jako je 99e2, můžeme použít obecné číselné třídění.
Funkce
unsorted-numeric-values ()seq 100 | sort --random-sort | sed '3i 9e2' | sed '3i 99K'
Zvažte seřazený výstup pomocí každé metody. Všimněte si, že kromě toho, že obsahuje hodnoty 1 až 100, seznam obsahuje také „9e12“ (900) a „99K“ (99000).
Příkazový řádek
netříděné číselné hodnoty | třídit -nVýstup
9697
98
99
99 tis
100
A co 900 a 99000. Máte pravdu, je to jen číselné třídění. další.
Příkazový řádek
netříděné číselné hodnoty | třídit -hVýstup
9697
98
99
100
99 tis
A co 900. Máte pravdu, je to jen lidský číselný druh. další.
Příkazový řádek
netříděné číselné hodnoty | třídit -gVýstup
9697
98
99
99 tis
100
9e2
A co 99000. Máte pravdu, je to jen obecný číselný druh. Jak vidíte, v tomto případě není kompatibilní žádná metoda třídění; To však neznamená, že nemůžete přijít s opravou.
Příkazový řádek
netříděné číselné hodnoty | sed 's / [kK] / e3 /' | třídit -gVýstup
9697
98
99
100
9e2
99e3
Nyní je to spíš podobné.
Příklad) Lidské číselné třídění
Pokud potřebujeme seřadit číselné hodnoty, přičemž vezmeme v úvahu význam zápisů jako K, G, M a E, můžeme použít lidské číselné třídění.
Příkazový řádek
seq 100 | sort --random-sort | sed '3i 3k' | třídit -hVýstup
9697
98
99
100
3k
Příklad) Numerické řazení
Pokud vše, co potřebujeme, je seřadit celá čísla, numerické třídění je trik.
Příkazový řádek
seq 100 | sort --random-sort | sort --numerics-sortVýstup
9596
97
98
99
100
Příklad) Třídění podle měsíce
Třídění podle měsíce umožňuje objednávat řádky podle měsíce. Mohlo by se ukázat jako užitečné pro seskupování řádků podle měsíce, zejména v případě, že není k dispozici možnost řazení podle času.
Funkce
měsíce ()kočka <
Února
Mar
Dubna
Smět
Červen
Jul
Srpen
Září
Října
listopad
Prosinec
EOF
Předpokládejme, že to nejsou měsíce seřazené.
Příkazový řádek
měsíce | třídit - náhodně tříditVýstup
MarŘíjna
Prosinec
Dubna
Smět
Září
Srpen
listopad
Jul
Jan
Února
Červen
Vždy můžeme třídit podle měsíce.
Příkazový řádek
měsíce | sort --random-sort | třídit - třídit měsíceVýstup
JanÚnora
Mar
Dubna
Smět
Červen
Jul
Srpen
Září
Října
listopad
Prosinec
Všimněte si, že pokud v listopadu změníme Dec na jakýkoli podřetězec, řekněme „Novem“, objeví se za „Nov“ v seřazeném výstupu.
Příklad) Náhodné řazení - zabijte terminál někoho jiného
Jak se dalo očekávat, náhodné řazení dělá opak řazení, míchá řádky.
Předpokládejme, že pro vzdělávací účely chceme zabít jiného uživatele. Museli bychom se ujistit, že to není naše pty, a náhodně vybrat výpisy, aby to bylo hezčí a abychom mohli říci, že ptys byly vybrány náhodně.
Příkazy
message-pty ()místní pty;
pty = "$ 1"
;
echo -n "Jdete dolů do"> / dev / $ pty;
pro i v 5 4 3 2 1;
dělat
spát 1;
echo -n "$ i"> / dev / $ pty;
Hotovo;
ozvěna „Ahoj!"> / dev / $ pty;
spát 1
ps | grep pty | grep -v -e $ (mypty) | sort --random-sort | hlava -1> stdin;
message-pty $ (pty < stdin );
zabít $ (pid < stdin )
Výstup v terminálu někoho jiného
Jdete dolů v 5 4 3 2 1 Sbohem!]
(výstup)
Příklad) Třídění verzí - třídění ips
Jak víte, zdrojové soubory mohou být verzovány pomocí řetězců, jako je 1.0. Verze navíc mohou jít hlouběji s čísly verzí jako 1.0.0, jak je vidět v populárních schématech sémantické verze.
Třídění verzí umožňuje třídit čísla verzí. Skvělý! Co teď? Pojďme to vyzkoušet.
Pro tento příklad jsem připravil bash skript pro generování náhodných ips, abychom tam nemuseli chodit. Je to v repo. Pro ty z nás, kteří nemají repo, je zde rychlý začátek.
Příkazy
git clone https: // github.com / temptemp3 / linuxhint.com.sakraalias random-ips = 'test -f "linuxhint.com / generate-random-ips.sh "; bash $ _ '
Teď, když jste připraveni, pojďme začít.
Příkazový řádek
random-ips 200 | tee ipsVýstup
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
Dobře, funguje to. Nyní se podívejme, co se stane, když se pokusíme třídit ips.
Příkazový řádek
třídit ipsVýstup
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 první pohled se zdá, že funguje, ale řádky jako 8.96.11.181 by se mělo objevit jinde.
Příkazy
pro o v d h n V g M
dělat
třídit ips - $ o> ips $ o ,,
Hotovo
echo all sorts same numeric sort
diff ips n, d 1> / dev / null || echo slovník pořadí != číselné třídění
diff ips n, h 1> / dev / null || echo lidské číselné třídění != číselné třídění
diff ips n, g 1> / dev / null || echo obecné číselné třídění != číselné třídění
diff ips n, v 1> / dev / null ||
echo verze seřadit != číselné třídění
show_n_v_ips_diff = "true"
test ! „$ show_n_v_ips_diff“ || diff ips n, v
Výstup
všechny druhy se rovnají numerickému řazenípořadí slovníků != číselné třídění
třídění verzí != číselné třídění
13,14 d12
< 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
Jak vidíte, řazení verzí vám umožňuje třídit čísla verzí, když selžou jiné metody řazení.
Příklad) Třídění verzí - řazení názvů souborů podle čísel verzí
V návaznosti na poslední příklad pojďme použít třídění verzí o něco blíže zamýšlenému použití. Jak víte, čísla verzí se běžně objevují v názvech souborů. Viz Podrobnosti o řazení verzí.
Nejprve pojďme transformovat ips na něco jiného, jako je zdrojový soubor projektu.
Příkazy
alpha ()alpha = "abcdefghijklmnopqrstuvwxyz";
echo -n $ alpha: $ ((RANDOM% 26)): 1
beta ()
alpha = "ab";
echo -n $ alpha: $ ((RANDOM% 2)): 1
kočičí ips | při čtení -r řádek; dělat
echo $ (alpha) -v $ line $ (test $ ((RANDOM% 5)) -eq 0 || beta).dehet.gz;
hotovo | odpaliště
Výstup
x-v56.16.109.54.dehet.gzk-v117.38.14.165a.dehet.gz
d-v87.59.32.91a.dehet.gz
h-v115.215.64.100.dehet.gz
s-v72.174.246.218b.dehet.gz
h-v163.93.19.173.dehet.gz
u-v184.225.11.92b.dehet.gz
y-v205.53.5.211a.dehet.gz
t-v175.196.164.17b.dehet.gz
e-v167.42.221.178b.dehet.gz
c-v126.54.190.189b.dehet.gz
b-v169.180.221.131a.dehet.gz
y-v210.125.170.231a.dehet.gz
x-v71.56.120.9b.dehet.gz
Cvičení
Zajistěte, aby výše uvedené příkazy běžely rychleji pomocí xargs
Podívejte se na příklad, jak používat příkaz xargs v bash skriptech.
Tentokrát se nebudeme obtěžovat ani použitím žádné z dalších metod třídění.
Příkazový řádek
třídit -V douškyVýstup
d-v127.100.108.192.dehet.gze-v62.140.229.42a.dehet.gz
e-v149.77.211.215a.dehet.gz
e-v167.42.221.178b.dehet.gz
e-v194.189.236.29a.dehet.gz
e-v198.145.199.84b.dehet.gz
e-v240.1.147.196b.dehet.gz
f-v50.100.142.42b.dehet.gz
f-v117.58.230.116.dehet.gz
f-v139.17.210.68b.dehet.gz
f-v153.18.145.133b.dehet.gz
g-v201.153.203.60b.dehet.gz
g-v213.58.67.108.dehet.gz
h-v5.206.37.224.dehet.gz
Nyní vidíte, že řazení verzí může být užitečné při třídění názvů souborů s čísly verzí.
Předtřídit
Řazení má čtyři hlavní možnosti, které ovlivňují skutečné třídění, jmenovitě, -ignore-vedoucí-mezery, -ignore-case, -ignore-nonprinting a -dictionary-order, které se mohou nebo nemusí překrývat. Následuje příklad použití každé možnosti.
Řazení ignoruje úvodní mezery
Řazení umožňuje ignorovat vstupní mezery jako možnost. V seřazeném výstupu jsou zachovány úvodní mezery.
Volba
--ignorovat přední mezeryPoužívání
třídit - přední-přední-prázdné mezeryPříkazy
slavní lidé> fpkočka >> fp << EOF
Marilyn Monroe (1926-1962)
Abraham Lincoln (1809 - 1865)
EOF
kočka fp | třídit | tac
Výstup
Alfred Hitchcock (1899 - 1980)Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)
Marilyn Monroe (1926-1962)
Abraham Lincoln (1809 - 1865)
Všimněte si, že úvodní mezery v řádcích přidaných do fp se zobrazují jako první ve výstupu řazení.
Abychom to napravili, musíme ignorovat úvodní mezery následujícím způsobem.
Příkazy
slavní lidé> fpkočka >> fp << EOF
Marilyn Monroe (1926-1962)
Abraham Lincoln (1809 - 1865)
EOF
kočka fp | třídit --ignore-vedoucí-prázdné stránky --ignore-vedoucí-prázdné stránky | tac
Výstup
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)
Alternativy
kočka fp | sed 's / ^ \ s * //' | třídit | tacVšimněte si, že alternativa nezachová úvodní mezery ve výstupu řazení.
Řadit ignorování velkých a malých písmen
Třídění umožňuje ignorovat vstupní případy. Případ je zachován v seřazeném výstupu.
Volba
--ignorovat případPoužívání
třídit --ignore-casePříkazy
slavní lidé> fpkočka >> fp << EOF
Abraham Lincoln (1809 - 1865)
ABraham Lincoln (1809 - 1865)
EOF
kočka fp | třídit | tac
Výstup
Amelia Earhart (1897 - 1937)Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)
ABraham Lincoln (1809 - 1865)
Všimněte si, že úvodní mezery v řádcích přidaných do fp se zobrazují jako první ve výstupu řazení.
Abychom to napravili, musíme ignorovat úvodní mezery následujícím způsobem.
Příkazy
slavní lidé> fpkočka >> fp << EOF
Abraham Lincoln (1809 - 1865)
ABraham Lincoln (1809 - 1865)
EOF
kočka fp | sort --ignore-case | tac
Výstup
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)
Alternativy
kočka fp | při čtení -r řádek; do echo $ line ,,; hotovo | třídit | tacVšimněte si, že alternativa nezachová velká a malá písmena ve výstupu řazení.
Třídění ignoruje netisk
Třídění umožňuje ignorovat netištěný vstup jako možnost. Netisk je zachován v seřazeném výstupu.
Volba
--ignorovat-netisknoutPoužívání
sort --ignore-nonprintingPříkazy
slavní lidé> fpecho -e "\ x90Abe" >> fp
kočka fp | třídit | tac
Výstup
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)
Vypadá to, že nám chybí zadání „Abe“ k netisknutelným znakům ve vstupu řazení.
Abychom to napravili, musíme ignorovat netisknutelné znaky.
Příkazy
slavní lidé> fpecho -e "\ x90Abe" >> fp
kočka fp | třídit --ignore-netisk | tac
[/ cc \
Výstup
[cc lang = "bash"]
Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)
„Abe
Pořadí řazení slovníku
Třídění umožňuje ignorovat všechny vstupy kromě mezer a alfanumerických znaků. Vstup je zachován v seřazeném výstupu.
slavní lidé> fpecho -e "\ x90Abe" >> fp
kočka fp | sort --d | tac
Třídění příspěvků
Třídění má jednu hlavní možnost, která neovlivňuje řazení, a to, -reverse. Ovlivňuje to však výstup, což umožňuje přepínat pořadí mezi vzestupným a sestupným. Následuje příklad.
Třídit zpětný výstup
Třídění umožňuje, aby byl výstup zobrazen v opačném pořadí.
Volba
--zvrátitPoužívání
třídit - obráceněPříkazový řádek
slavní lidé | třídit - obráceněVýstup
Angelina Jolie (1975 -)Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)
Alternativy
třídit | tacDalší možnosti řazení
Existuje dvacet dva dalších možností řazení. Následují příklady.
Kontrola řazení
Řazení má možnost, která vám umožní zkontrolovat, zda je vstup seřazen. Vrátí se po první instanci netříděného řádku. V případě, že je vyžadováno seřazení vstupu, ale je pravděpodobné, že je již v pořádku, je vhodné použít kontrolu řazení.
Volba
--šekPoužívání
třídit - zaškrtnoutPříkazový řádek
č. 10 | sort --random-sort | třídit - zaškrtnoutVýstup
druh: -: 3: porucha: 10Příkazový řádek
č. 10 | sort --random-sort | třídit | třídit - zaškrtnoutVýstup
(prázdný)Třídit výstup
Řazení má možnost, která vám umožňuje zadat soubor, do kterého se má zapisovat, místo aby používal standardní výstup nebo přesměrování. Jeho použití může zlepšit kompatibilitu napříč skriptovacím prostředím.
Volba
--výstup = SOUBORPoužívání
sort --output = SOUBORPříkazový řádek
č. 10 | sort --random-sort --output = random-10Výstup
(prázdný)Řazení null ukončeno
Řazení má možnost, která vám umožní nastavit oddělovač řádků na nulu místo nového řádku.
Volba
--nulové zakončeníPoužívání
sort - nulové zakončeníPříkazový řádek
č. 10 | tr '\ 012' '\ 000' | sort --zero-terminated --random-sortVýstup
25346178910Třídit stabilní
Řazení má možnost, která vám umožní zakázat porovnání poslední instance. Výsledkem může být dosažení stabilnějších běhových časů v případě dostatečně velkých vstupů, které by mohly způsobit nestabilitu běhu řazení.
Volba
--stabilníPoužívání
třídit - stabilníPříkazový řádek
časové období 1000000 | sort --random-sort | sort --stable> / dev / nullVýstup
skutečný 0m9.138suživatel 0m9.201s
sys 0m0.107s
Třídit velikost vyrovnávací paměti
Třídění má možnost, která vám umožňuje nastavit množství paměti použité jako vyrovnávací paměť při třídění. Lze jej použít k omezení spotřeby paměti při třídění větších vstupů. Může to mít vliv na výkon.
Volba
--velikost vyrovnávací paměti = SIZEPoužívání
sort --buffer-size = 64Příkazový řádek
časové období 1000000 | třídit - náhodně - třídit | sort -stable -buffer-size = 64> / dev / null
Výstup
skutečný 0m21.685suživatel 0m9.858s
sys 0m2.092s
Třídit jedinečné
Řazení má možnost, která umožňuje odstranit duplicitní řádky ve výstupu řazení
Volba
--unikátníPoužívání
třídit - jedinečnéPříkazový řádek echo 1 2 2 4 5 | tr '\ 040' '\ 000' | sort --zero-terminated --unique
Výstup
1245Alternativy
třídit | uniqZávěr
Sort je externí příkaz, který je užitečný nejen při použití v kombinaci s jinými externími příkazy, ale také se hodí při použití s příkazy bez integrované metody řazení, jako je uživatelsky definovaná funkce nebo bash skripty obecně.