Sorteerimisega saate faile tellida sõnastiku järjestuse või arvulise väärtuse alusel, juhuslikult jaotada failiridu, eemaldada duplikaatread ja kontrollida, kas fail on sorteeritud.
Võib-olla saate sellega teha muid asju, kuid kõigepealt muretseme selle pärast, et keerame pea ümber, kuidas kasutada Bashi skriptides sorteerimist.
Mis on omamoodi?
Sort on väline käsk, mis liidab failid, sorteerides nende sisu vastavalt sorditüübile ja kirjutab sortimise tulemused standardväljundisse.
Sorteeri bashi käsuvalikud
Sordi käsul on 31 valikut (13 peamist ja 18 kategooriateks muud kategooriad). Enamik kogenumaid bash-programmeerimisi (isegi eksperdid) teavad vaid mõnda peamist sorteerimisvõimalust, mis on vajalik läbisaamiseks. Teisi puudutatakse harva. Sinu jaoks on õnn, meil on aega neid kõiki puudutada.
Peamised sortimisvalikud
Need on valikud, mis aitavad teil asju teha ja sortida (sortimine) lisaks sorteeritud tulemuste manipuleerimisele (järeltöötlus) ja filtrite rakendamisele (filtrid) enne sortimist.
Sorteerimine
Sorteerimisel on 5 erinevat sorteerimistüüpi. Siin on tabel, mis näitab iga sortimistüüpi ja seotud valikuid.
Sorteeri | Lühike valik / pikk valik / jne sõna |
Numbriline sort (üldine) | -g / -üldine-numbriline-sorteerimine üld-numbriline teadusliku märkuse toetamine 0.1234e4 = 1234 |
Numbriline sort (inimene) | -h / -inimlik-numbriline-sorteerimine inim-numbriline 1.234K = 1234 |
Numbriline | -n / -numbriline-sorteerimine numbriline … < -1 < 0 < 1 <… |
Kuu | -M / -kuu-sort kuu Teadmata < Jan < Feb <… < Nov < Dec |
Juhuslik | -r / -juhuslik-sorteerimine juhuslik |
Versioon | -V / -versioon-sorteerimine versioon |
Pange tähele, et iga sortimise tüübil on pikk valik, mis lõpeb -sordiga. Lisaks konkreetsetele sortimisvalikutele võib sõnade järgi sortimiseks kasutada valikut -sort = WORD. Näiteks võib -random-sort või -r asemel kasutada -sort = random.
Näited
Siin on mõned sortimismeetodite näited sortimisest.
Näide) Nimede sorteerimine
Sortimisel pole probleeme ridade tähestikulises järjestuses. Mõelge nimekirja kuulsatest inimestest, mida pole sorteeritud.
Funktsioon
kuulsad inimesed()lokk - vaikne https: // www.elulugu võrgus.net / inimesed / kuulus-100.HTML
| grep post-content | sed-s /<[^>] *.// g '-e' s / II maailmasõda // g '-e' s / \ (Wilbur \)
/ \ 1 Wright / '| grep -o -e '\ (\ ([A-Z] \ + [.] \?\) \ + [a-z] * \ s \) \ + ([0-9] \ + \ s [^)] \+."
Käsurida
kuulsad inimesed | sorteeridaVäljund
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)
Näide) Üldine numbriline sort
Kui peame arvulised väärtused sorteerima, võttes arvesse teaduslikke noote, näiteks 99e2, võime kasutada üldist numbrilist sortimist.
Funktsioon
sortimata-numbrilised väärtused ()järgnev 100 | sort - juhuslik-sort | sed '3i 9e2' | sed '3i 99K'
Mõelge iga meetodi järgi sorteeritud väljundile. Pange tähele, et lisaks väärtuste 1 kuni 100 sisaldamisele sisaldab loend ka '9e12' (900) ja '99K' (99000).
Käsurida
sortimata-arvväärtused | sorteerida -nVäljund
9697
98
99
99K
100
Aga 900 ja 99000. Täpselt, see on lihtsalt numbriline sort. Järgmine.
Käsurida
sortimata-arvväärtused | sort -hVäljund
9697
98
99
100
99K
Aga 900. Täpselt nii, see on lihtsalt inimlik numbriline sort. Järgmine.
Käsurida
sortimata-arvväärtused | sorteeri -gVäljund
9697
98
99
99K
100
9e2
Aga 99000. Täpselt nii, see on lihtsalt üldine numbriline sort. Nagu näete, ei sobi sel juhul ükski sortimismeetod; see aga ei tähenda, et te ei saaks lahendust välja mõelda.
Käsurida
sortimata-arvväärtused | sed 's / [kK] / e3 /' | sorteeri -gVäljund
9697
98
99
100
9e2
99e3
Nüüd on see rohkem sarnane.
Näide) Inimeste numbriline sort
Kui peame arvulised väärtused sorteerima, võttes tegelikult arvesse tähistuste nagu K, G, M ja E tähendust, võime kasutada inimese numbrilist sortimist.
Käsurida
järgnev 100 | sort - juhuslik-sort | sed '3i 3k' | sort -hVäljund
9697
98
99
100
3k
Näide) Numbriline sort
Kui meil on vaja ainult täisarvude sortimist, teeb numbriline sortimine seda trikki.
Käsurida
järgnev 100 | sort - juhuslik-sort | sort - numbrid-sortVäljund
9596
97
98
99
100
Näide) Kuu sortimine
Kuu sortimine võimaldab teil ridu järjestada kuude kaupa. See võib osutuda kasulikuks ridade rühmitamiseks kuude kaupa, eriti juhul, kui aja järgi sorteerimise võimalus pole saadaval.
Funktsioon
kuud ()kass <
Veebruar
Märts
Apr
Mai
Juuni
Juuli
Aug
Sept
Okt
Nov
Dets
EOF
Oletame, et neid kuid ei sorteerita.
Käsurida
kuud | sort - juhuslik-sortVäljund
MärtsOkt
Dets
Apr
Mai
Sept
Aug
Nov
Juuli
Jan
Veebruar
Juuni
Saame alati sortida kuude kaupa.
Käsurida
kuud | sort - juhuslik-sort | sort - kuu-sortVäljund
JanVeebruar
Märts
Apr
Mai
Juuni
Juuli
Aug
Sept
Okt
Nov
Dets
Pange tähele, et kui novembris muudame detsembri mis tahes alamstringiks, öeldes "Novem", kuvatakse see järjestatud väljundis pärast "Nov".
Näide) Juhuslik sortimine - tapke kellegi teise terminal
Ootuspäraselt teeb juhuslik sortimine sorteerimisele vastupidist, segab ridu.
Oletame, et hariduse eesmärgil tahame teise kasutaja tappa. Peaksime veenduma, et see pole meie pty, ja loendid randomiseerima, et see oleks toredam ja et saaksime öelda, et ptys valiti juhuslikult.
Käsud
sõnum-pty ()kohalik pty;
pty = "$ 1"
;
kaja -n "Sa lähed alla"> / dev / $ pty;
i jaoks 5 4 3 2 1;
tegema
magama 1;
kaja -n "$ i"> / dev / $ pty;
tehtud;
kaja "Nägemist!"> / dev / $ pty;
uni 1
ps | grep pty | grep -v -e $ (mypty) | sort - juhuslik-sort | pea -1> stdin;
sõnum-pty $ (pty < stdin );
tapma $ (pid < stdin )
Väljund kellegi teise terminalis
Sa lähed alla 5 4 3 2 1 Hüvasti!]
(väljumine)
Näide) Versiooni sorteerimine - sortimine ips
Nagu teate, võivad lähtefailide versioonid olla näiteks stringide 1 abil.0. Lisaks võivad versioonid minna sügavamale versiooninumbritega nagu 1.0.0 nagu on näha populaarsetes semantiliste versioonide skeemides.
Versioonide sortimine võimaldab teil sortida versiooninumbreid. Suurepärane! Mis nüüd? Katsetame seda.
Selle näite jaoks olen koostanud bashi skripti juhuslike ips-ide genereerimiseks, et me ei peaks sinna minema. See on repos. Neile meist, kellel repot pole, on kiire algus.
Käsud
gitkloon https: // github.com / temptemp3 / linuxhint.com.gitalias random-ips = 'test -f "linuxhint.com / generaator-juhuslik-ips.sh "; bash $ _ '
Nüüd, kui olete valmis, alustame.
Käsurida
juhuslik ips 200 | tee ipsVäljund
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
Okei, see töötab. Vaatame nüüd, mis juhtub, kui proovime IP-sid sortida.
Käsurida
sorteeri ipsVäljund
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
Esmapilgul tundub, et see töötab, kuid jooned nagu 8.96.11.181 peaks ilmuma mujale.
Käsud
o jaoks d d n n V g M
tegema
sort ips - $ o> ips $ o ,,
tehtud
kaja kõikvõimalikud võrdsed numbrilised sordid
diff ips n, d 1> / dev / null || kajasõnastiku järjekord != numbriline sort
diff ips n, h 1> / dev / null || kaja inimese numbriline sort != numbriline sort
diff ips n, g 1> / dev / null || kaja üldine numbriline sort != numbriline sort
diff ips n, v 1> / dev / null ||
kajaversiooni sortimine != numbriline sort
show_n_v_ips_diff = "true"
test ! "$ show_n_v_ips_diff" || diff ips n, v
Väljund
igasugused võrdsed numbrilised sortsõnastiku järjekord != numbriline sort
versiooni sortimine != numbriline sort
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
Nagu näete, võimaldab versioonisorteerimine sortida versiooninumbreid, kui muud sortimismeetodid nurjuvad.
Näide) Versioonide sortimine - failinimede sortimine versiooninumbritega
Viimasele näitele toetudes kasutame versioonisorteerimist veidi lähemale selle kavandatud kasutusele. Nagu teate, ilmuvad versiooninumbrid tavaliselt failinimedes. Vt üksikasju versioonide sortimise kohta.
Esiteks muudame ips millekski muuks projekti lähtekoodifailiks.
Käsud
alfa ()alfa = "abcdefghijklmnopqrstuvwxyz";
kaja -n $ alpha: $ ((RANDOM% 26)): 1
beeta ()
alfa = "ab";
kaja -n $ alpha: $ ((RANDOM% 2)): 1
kass ips | lugedes -r rida; tegema
echo $ (alfa) -v $ line $ (test $ ((RANDOM% 5)) -eq 0 || beeta.tõrv.gz;
tehtud | tee lonksud
Väljund
x-v56.16.109.54.tõrv.gzk-v117.38.14.165a.tõrv.gz
d-v87.59.32.91a.tõrv.gz
h-v115.215.64.100.tõrv.gz
s-v72.174.246.218b.tõrv.gz
h-v163.93.19.173.tõrv.gz
u-v184.225.11.92b.tõrv.gz
y-v205.53.5.211a.tõrv.gz
t-v175.196.164.17b.tõrv.gz
e-v167.42.221.178b.tõrv.gz
c-v126.54.190.189b.tõrv.gz
b-v169.180.221.131a.tõrv.gz
y-v210.125.170.231a.tõrv.gz
x-v71.56.120.9b.tõrv.gz
Harjutus
Pange ülaltoodud käsud xargsi abil kiiremini käima
Vaadake näidet selle kohta, kuidas kasutada käsku xargs bashi skriptides.
Seekord ei viitsi me ühtegi teist sorteerimismeetodit kasutada.
Käsurida
sorteeri -V lonksudVäljund
d-v127.100.108.192.tõrv.gze-v62.140.229.42a.tõrv.gz
e-v149.77.211.215a.tõrv.gz
e-v167.42.221.178b.tõrv.gz
e-v194.189.236.29a.tõrv.gz
e-v198.145.199.84b.tõrv.gz
e-v240.1.147.196b.tõrv.gz
f-v50.100.142.42b.tõrv.gz
f-v117.58.230.116.tõrv.gz
f-v139.17.210.68b.tõrv.gz
f-v153.18.145.133b.tõrv.gz
g-v201.153.203.60b.tõrv.gz
g-v213.58.67.108.tõrv.gz
h-v5.206.37.224.tõrv.gz
Nüüd näete, et versioonide sortimine võib olla kasulik failinimede sortimisel versiooninumbritega.
Eel sortimine
Sorteerimisel on neli peamist valikut, mis mõjutavad tegelikku sorteerimist, nimelt -ignore-Leading-blankins, -ignore-case, -ignore-nonprinting ja -dictionary-order, mis võivad kattuda või mitte. Järgige iga valiku kasutamise näidet.
Sorteerige eirates esilaternaid
Sortimine võimaldab sisendtoorikute tühikuid kui valikut ignoreerida. Juhtivad toorikud säilitatakse sorteeritud väljundis.
Variant
--ignoreeri toorikuidKasutamine
sort --ignore-lead-blankinsKäsud
kuulsad inimesed> fpkass >> fp << EOF
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)
EOF
kassi fp | sorteeri | tac
Väljund
Alfred Hitchcock (1899 - 1980)Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)
Pange tähele, et fp-le lisatud ridade eesmised tühikud kuvatakse sortimisväljundis esimesena.
Selle parandamiseks peame eirama juhtivaid toorikuid järgmiselt.
Käsud
kuulsad inimesed> fpkass >> fp << EOF
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)
EOF
kassi fp | sorteeri --ignore-lead-blanks --ignore-lead-blanks | tac
Väljund
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)
Alternatiivid
kassi fp | sed 's / ^ \ s * //' | sorteeri | tacPange tähele, et alternatiiv ei säilita sorteerimisväljundis juhtivaid tühikuid.
Sordi ignoreerimine
Sorteerimine võimaldab sisend- ja väiketähti kui valikut ignoreerida. Juhtum säilitatakse sorteeritud väljundis.
Variant
--ignoreeri juhtumitKasutamine
sort --ignore-caseKäsud
kuulsad inimesed> fpkass >> fp << EOF
abraham Lincoln (1809 - 1865)
ABraham Lincoln (1809 - 1865)
EOF
kassi fp | sorteeri | tac
Väljund
Amelia Earhart (1897 - 1937)Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)
ABraham Lincoln (1809 - 1865)
Pange tähele, et fp-le lisatud ridade eesmised tühikud kuvatakse sortimisväljundis esimesena.
Selle parandamiseks peame eirama juhtivaid toorikuid järgmiselt.
Käsud
kuulsad inimesed> fpkass >> fp << EOF
abraham Lincoln (1809 - 1865)
ABraham Lincoln (1809 - 1865)
EOF
kassi fp | sort --ignore-case | tac
Väljund
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)
Alternatiivid
kassi fp | lugedes -r rida; tee kaja $ rida ,,; tehtud | sorteeri | tacPange tähele, et alternatiiv ei säilita suurtähti sortimisväljundis.
Sortimine ignoreerides printimist
Sortimine võimaldab sisendina printimist eirata kui valikut. Nonprinting säilib sorteeritud väljundis.
Variant
--ignoreeri-printimataKasutamine
sort --ignore-nonprintingKäsud
kuulsad inimesed> fpkaja -e "\ x90Abe" >> fp
kassi fp | sorteeri | tac
Väljund
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)
Tundub, et sortide sisestamisel puudub tähemärkide mitteprintimiseks „Abe” toiming.
Selle parandamiseks peame ignoreerima mittetrükkivaid märke.
Käsud
kuulsad inimesed> fpkaja -e "\ x90Abe" >> fp
kassi fp | sort --ignore-nonprinting | tac
[/ cc \
Väljund
[cc lang = "bash"]
Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)
BeAbe
Sordi sõnastiku järjekord
Sortimine võimaldab ignoreerida kõiki sisendeid, välja arvatud tühikud ja tähtnumbrilised märgid. Sisend säilitatakse sorteeritud väljundis.
kuulsad inimesed> fpkaja -e "\ x90Abe" >> fp
kassi fp | sort --d | tac
Postituse sortimine
Sorteerimisel on üks peamine valik, mis sorteerimist ei mõjuta, nimelt -reverse. Kuid see mõjutab väljundit, võimaldades järjestuse vahetada tõusva ja langeva vahel. Järgneb näide.
Sorteeri pöördväljund
Sortimine võimaldab väljundit kuvada vastupidises järjekorras.
Variant
--tagurpidiKasutamine
sort - tagurpidiKäsurida
kuulsad inimesed | sort - tagurpidiVäljund
Angelina Jolie (1975 -)Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)
Alternatiivid
sorteeri | tacMuud sortimise valikud
Sorteerimiseks on veel kakskümmend kaks võimalust. Järgnevad näited.
Sorteeri kontroll
Sortimisel on suvand, mis võimaldab teil kontrollida, kas sisend on sorditud. See naaseb pärast sorteerimata rea esimest eksemplari. Juhul, kui sisend tuleb sortida, kuid on tõenäoliselt juba korras, on sordikontrolli kasutamine sobilik.
Variant
--KontrollimaKasutamine
sort - kontrollimaKäsurida
järgnev 10 | sort - juhuslik-sort | sort - kontrollimaVäljund
sort: -: 3: häire: 10Käsurida
järgnev 10 | sort - juhuslik-sort | sorteeri | sort - kontrollimaVäljund
(tühi)Sordi väljund
Sortimisel on suvand, mis võimaldab teil standardse väljundi või ümbersuunamise asemel määrata faili, kuhu kirjutada. Selle kasutamine võib parandada skriptikeskkondade ühilduvust.
Variant
--väljund = FILEKasutamine
sort - väljund = FILEKäsurida
järgnev 10 | sort --random-sort --output = juhuslik-10Väljund
(tühi)Sortimine null lõpetatud
Sorteerimisel on suvand, mis võimaldab teil rea eraldaja uueks reaks nullida.
Variant
--nullotsagaKasutamine
sort - nulliga lõpetatudKäsurida
järgnev 10 | tr '\ 012' '\ 000' | sort - nullotsaga --random-sortVäljund
25346178910Sorteeri stabiilselt
Sortimisel on suvand, mis võimaldab teil viimase võimaluse võrdluse keelata. Selle tulemusel võidakse saavutada stabiilsemad käitusajad piisavalt suurte sisendite korral, mis võivad põhjustada sorteerimise ebastabiilsuse.
Variant
--stabiilneKasutamine
sort - stabiilneKäsurida
ajajärg 1000000 | sort - juhuslik-sort | sort --stabiil> / dev / nullVäljund
reaalne 0m9.138. aastadkasutaja 0m9.201. aastad
sys 0m0.107. aastad
Sordi puhvri suurus
Sortimisel on suvand, mis võimaldab teil sortimise ajal määrata puhvrina kasutatava mälu. Seda saab kasutada mälu tarbimise piiramiseks suuremate sisendite sorteerimisel. See võib mõjutada jõudlust.
Variant
--puhvri suurus = SIZEKasutamine
sortimine - ostja suurus = 64Käsurida
ajajärg 1000000 | sort -random-sort | sort -stable -buffer-size = 64> / dev / null
Väljund
reaalne 0m21.685skasutaja 0m9.858. aastad
sys 0m2.092s
Sordi ainulaadne
Sortimisel on suvand, mis võimaldab teil sortimise väljundist eemaldada duplikaatread
Variant
--ainulaadneKasutamine
sort - ainulaadneKäsurida kaja 1 2 2 4 5 | tr '\ 040' '\ 000' | sort - nulliga lõppev - ainulaadne
Väljund
1245Alternatiivid
sorteeri | ainulaadneJäreldus
Sortimine on väline käsk, mis pole kasulik ainult siis, kui seda kasutatakse koos teiste väliste käskudega, vaid see on mugav ka käskude korral, millel pole sisseehitatud tellimismeetodit, näiteks kasutaja määratud funktsioon või bashi skriptid üldiselt.