Příkazy pro Linux

Příkaz Bash sort

Příkaz Bash sort
Hodně štěstí při pokusu o implementaci třídicího algoritmu v bash, než skončí před zítřkem. Žádný strach, nemusíte, protože máte příkaz sort.

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řídit

Vý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 -n

Výstup

96
97
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 -h

Výstup

96
97
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 -g

Výstup

96
97
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 -g

Výstup

96
97
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 -h

Výstup

96
97
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-sort

Výstup

95
96
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  <Jan
Ú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řídit

Vý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íce

Vý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.sakra
alias 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 ips

Výstup

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

Dobře, funguje to. Nyní se podívejme, co se stane, když se pokusíme třídit ips.

Příkazový řádek

třídit ips

Výstup

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

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.gz
k-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šky

Výstup

d-v127.100.108.192.dehet.gz
e-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í mezery

Používání

třídit - přední-přední-prázdné mezery

Příkazy

slavní lidé> fp
koč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é> fp
koč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 | tac

Vš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řípad

Používání

třídit --ignore-case

Příkazy

slavní lidé> fp
koč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é> fp
koč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 | tac

Vš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-netisknout

Používání

sort --ignore-nonprinting

Příkazy

slavní lidé> fp
echo -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é> fp
echo -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é> fp
echo -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átit

Použí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 | tac

Další 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

--šek

Používání

třídit - zaškrtnout

Příkazový řádek

č. 10 | sort --random-sort | třídit - zaškrtnout

Výstup

druh: -: 3: porucha: 10

Příkazový řádek

č. 10 | sort --random-sort | třídit | třídit - zaškrtnout

Vý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 = SOUBOR

Používání

sort --output = SOUBOR

Příkazový řádek

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

Vý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-sort

Výstup

25346178910

Tří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 / null

Výstup

skutečný 0m9.138s
už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 = SIZE

Používání

sort --buffer-size = 64

Příkazový řádek

časové období 1000000 | třídit - náhodně - třídit | sort -stable -buffer-size = 64> / dev / null

Výstup

skutečný 0m21.685s
už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

1245

Alternativy

třídit | uniq

Zá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ě.

Hry Vulkan pro uživatele Linuxu
Vulkan pro uživatele Linuxu
S každou novou generací grafických karet vidíme, že vývojáři her posouvají hranice grafické věrnosti a přibližují se k fotorealismu. Ale navzdory vešk...
Hry OpenTTD vs Simutrans
OpenTTD vs Simutrans
Vytvoření vlastní simulace dopravy může být zábavné, uvolňující a mimořádně lákavé. Proto se musíte ujistit, že vyzkoušíte co nejvíce her, abyste našl...
Hry Výukový program OpenTTD
Výukový program OpenTTD
OpenTTD je jednou z nejpopulárnějších her pro obchodní simulaci. V této hře musíte vytvořit skvělé dopravní podnikání. Začnete však na začátku kolem r...