Pomoću sortiranja možete poredati datoteke na temelju redoslijeda u rječniku ili prema numeričkoj vrijednosti, nasumično rasporediti redove datoteka, ukloniti dvostruke retke i provjeriti je li datoteka sortirana.
Možda ćete s time moći raditi i druge stvari, ali prvo, brinimo se o omotavanju glave oko toga kako koristiti sortiranje u bash skriptama.
Što je sortirati?
Sortiranje je vanjska naredba koja spaja datoteke dok sortira njihov sadržaj prema vrsti sortiranja i zapisuje rezultate sortiranja u standardni izlaz.
Poredaj opcije naredbi za bash
Naredba za sortiranje dolazi s 31 opcijom (13 glavnih i 18 kategoriziranih kao ostale). Većina iskusnih bash programiranja (čak i stručnjaci) znaju samo nekoliko glavnih opcija sortiranja potrebnih za prolazak. Druge rijetko tko dotakne. Srećom po vas što ih imamo vremena dotaknuti.
Glavne opcije sortiranja
Ovo su opcije koje vam pomažu u obavljanju poslova i razvrstavanju (sortiranje) uz manipulaciju sortiranim rezultatima (naknadna obrada) i primjenjivanje filtara (filtri) prije sortiranja.
Sortiranje
Sortiranje dolazi s 5 različitih vrsta sortiranja. Evo tablice koja prikazuje svaku vrstu sortiranja s povezanim opcijama.
Vrsta | Kratka opcija / duga opcija / itd riječ |
Numeričko sortiranje (općenito) | -g / -general-numeric-sort općenito-numerički podrška znanstvenom zapisu 0.1234e4 = 1234 |
Numerička sorta (ljudska) | -h / -ljudsko-brojčana-sorta ljudsko-brojčani 1.234K = 1234 |
Numerički | -n / -brojna-sorta brojčani .. < -1 < 0 < 1 <… |
Mjesec | -M / -mjesečno sortiranje mjesec Nepoznato < Jan < Feb <… < Nov < Dec |
Slučajno | -r / -random-sort slučajno |
Verzija | -V / -verzija-sortiranje verzija |
Imajte na umu da svaka vrsta sortiranja ima dugu opciju koja završava s -sort. Uz određene opcije sortiranja, za sortiranje po riječi može se koristiti i opcija -sort = WORD. Na primjer -sort = random može se koristiti umjesto -random-sort ili -r.
Primjeri
Evo nekoliko primjera naredbi za sortiranje za svaku metodu sortiranja.
Primjer) Sortiranje imena
Poredaj nema problema s razvrstavanjem linija po abecedi. Razmotrite popis poznatih ljudi koji nisu razvrstani.
Funkcija
poznati ljudi()curl - tiho https: // www.biografijaonline.net / people / known-100.html
| grep post-sadržaj | sed -e 's /<[^>] *.// g '-e' s / Drugi svjetski rat // g '-e' s / \ (Wilbur \)
/ \ 1 Wright / '| grep -o -e '\ (\ ([A-Z] \ + [.] \?\) \ + [a-z] * \ s \) \ + ([0-9] \ + \ s [^)] \+.'
Naredbeni redak
poznati ljudi | vrstaIzlaz
Stephen King (1947. -)Steve Jobs (1955. - 2012.)
Žalac (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.)
Primjer) Općenito numeričko sortiranje
Ako trebamo sortirati numeričke vrijednosti uzimajući u obzir znanstvene zapise poput 99e2, možemo koristiti opću numeričku sortiranje.
Funkcija
nesortirane-numeričke vrijednosti ()slijed 100 | sort --random-sort | sed '3i 9e2' | sed '3i 99K'
Razmotrite sortirani izlaz koristeći svaku metodu. Imajte na umu da osim što sadrži vrijednosti od 1 do 100, popis također uključuje '9e12' (900) i '99K' (99000).
Naredbeni redak
nesortirane-numeričke vrijednosti | razvrstati -nIzlaz
9697
98
99
99.000
100
Što je s 900 i 99000. Točno, to je samo numeričko sortiranje. Sljedeći.
Naredbeni redak
nesortirane-numeričke vrijednosti | sortiraj -hIzlaz
9697
98
99
100
99.000
Što je s 900. Točno, to je samo ljudska numerička sorta. Sljedeći.
Naredbeni redak
nesortirane-numeričke vrijednosti | razvrstaj -gIzlaz
9697
98
99
99.000
100
9e2
Što je s 99000. Točno, to je samo općenito numeričko sortiranje. Kao što vidite, u ovom slučaju nijedna metoda sortiranja nije kompatibilna; međutim, to ne znači da ne možete smisliti rješenje.
Naredbeni redak
nesortirane-numeričke vrijednosti | sed 's / [kK] / e3 /' | razvrstaj -gIzlaz
9697
98
99
100
9e2
99e3
Sad je to više slično.
Primjer) Ljudska numerička sorta
Ako trebamo razvrstati numeričke vrijednosti uzimajući u obzir značenje zapisa poput K, G, M i E, možemo koristiti ljudsku numeričku sortiranje.
Naredbeni redak
slijed 100 | sort --random-sort | sed '3i 3k' | sortiraj -hIzlaz
9697
98
99
100
3k
Primjer) Numeričko sortiranje
Ako sve što trebamo je sortiranje cijelih brojeva, numeričko sortiranje čini trik.
Naredbeni redak
slijed 100 | sort --random-sort | sort --numerics-sortIzlaz
9596
97
98
99
100
Primjer) Mjesečno razvrstavanje
Razvrstavanje po mjesecima omogućuje vam redoslijed redova po mjesecima. Moglo bi se pokazati korisnim za grupiranje linija po mjesecima, posebno u slučaju da opcija sortiranja po vremenu nije dostupna.
Funkcija
mjeseci ()mačka <
Veljače
Ožujka
Travanj
svibanj
Lipnja
Srpnja
Kolovoza
Rujna
Listopad
Studenoga
Prosinca
EOF
Pretpostavimo da se mjeseci ne sortiraju.
Naredbeni redak
mjeseci | sort - random-sortIzlaz
OžujkaListopad
Prosinca
Travanj
svibanj
Rujna
Kolovoza
Studenoga
Srpnja
Siječnja
Veljače
Lipnja
Uvijek možemo sortirati po mjesecima.
Naredbeni redak
mjeseci | sort --random-sort | sortirati - mjesec-sortiratiIzlaz
SiječnjaVeljače
Ožujka
Travanj
svibanj
Lipnja
Srpnja
Kolovoza
Rujna
Listopad
Studenoga
Prosinca
Imajte na umu da ako u studenom promijenimo bilo koji podniz koji kaže 'Novem', pojavit će se nakon 'Nov' u razvrstanom izlazu.
Primjer) Slučajno sortiranje - ubiti tuđi terminal
Kao što se i očekivalo, slučajno sortiranje radi suprotno od sortiranja, miješa linije.
Pretpostavimo da u obrazovne svrhe želimo ubiti drugog korisnika. Morali bismo biti sigurni da to nije naša šteta i randomizirati popise tako da budu ljepši i da možemo reći da su ptys odabrani nasumce.
Naredbe
poruka-pty ()lokalni pty;
pty = "$ 1"
;
echo -n "Idete dolje u"> / dev / $ pty;
za i u 5 4 3 2 1;
čini
spavati 1;
echo -n "$ i"> / dev / $ pty;
gotovo;
odjek "Ćao!"> / dev / $ pty;
spavati 1
ps | grep pty | grep -v -e $ (mypty) | sort --random-sort | glava -1> stdin;
poruka-pty $ (pty < stdin );
ubiti $ (pid < stdin )
Izlaz u tuđem terminalu
Dolazite za 5 4 3 2 1 Doviđenja!]
(Izlaz)
Primjer) Razvrstavanje verzije - sortiranje ips-a
Kao što znate, izvorne datoteke mogu se verzirati pomoću nizova kao što je 1.0. Nadalje, verzije mogu ići dublje s brojevima verzija poput 1.0.0 kao što se vidi u popularnim semantičkim shemama verzija.
Razvrstavanje verzija omogućuje sortiranje brojeva verzija. Sjajno! Što sad? Isprobajmo.
Za ovaj sam primjer pripremio bash skriptu za generiranje slučajnih ips-a kako ne bismo morali ići tamo. U repo je. Za one od nas koji nemaju repo ovdje je brz početak.
Naredbe
git klon https: // github.com / temptemp3 / linuxhint.com.gitalias random-ips = 'test -f "linuxhint.com / generiraj-slučajni-ips.sh "; bash $ _ '
Sad kad ste spremni, krenimo.
Naredbeni redak
random-ips 200 | tee ipsIzlaz
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
U redu, djeluje. Sada da vidimo što će se dogoditi kada pokušamo razvrstati ips.
Naredbeni redak
sortirati ipsIzlaz
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 prvi pogled čini se da djeluje, ali retci poput 8.96.11.181 trebao pojaviti negdje drugdje.
Naredbe
za o u d h n V g M
čini
sortiraj ips - $ o> ips $ o ,,
gotovo
odjek sve vrste jednake numeričke sortiranje
razlike ips n, d 1> / dev / null || redoslijed eho rječnika != numerička sorta
razlike ips n, h 1> / dev / null || odjek ljudska numerička sorta != numerička sortiranje
razlike ips n, g 1> / dev / null || odjek opća numerička sorta != numerička sorta
razlike ips n, v 1> / dev / null ||
echo version sortiranje != numerička sorta
show_n_v_ips_diff = "istina"
test ! "$ show_n_v_ips_diff" || razl. ips n, v
Izlaz
sve vrste jednake numeričkom sortiranjuredoslijed rječnika != numerička sortiranje
sortiranje verzije != numerička sorta
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
Kao što vidite, sortiranje verzija omogućuje vam sortiranje brojeva verzija kada druge metode sortiranja ne uspiju.
Primjer) Razvrstavanje verzija - razvrstavanje imena datoteka s brojevima verzija
Nadovezujući se na posljednji primjer, upotrijebimo sortiranje verzije malo bliže namjeni. Kao što znate, brojevi verzija često se pojavljuju u imenima datoteka. Pogledajte Pojedinosti o sortiranju verzije.
Prvo, pretvorimo ips u nešto drugo poput izvorne datoteke projekta.
Naredbe
alfa ()alfa = "abcdefghijklmnopqrstuvwxyz";
echo -n $ alpha: $ ((RANDOM% 26)): 1
beta ()
alfa = "ab";
echo -n $ alpha: $ ((RANDOM% 2)): 1
mačka ips | dok se čita -r redak; čini
echo $ (alpha) -v $ line $ (test $ ((RANDOM% 5)) -eq 0 || beta).katran.gz;
gotovo | tee gutljaje
Izlaz
x-v56.16.109.54.katran.gzk-v117.38.14.165a.katran.gz
d-v87.59.32.91a.katran.gz
h-v115.215.64.100.katran.gz
s-v72.174.246.218b.katran.gz
h-v163.93.19.173.katran.gz
u-v184.225.11.92b.katran.gz
y-v205.53.5.211a.katran.gz
t-v175.196.164.17b.katran.gz
e-v167.42.221.178b.katran.gz
c-v126.54.190.189b.katran.gz
b-v169.180.221.131a.katran.gz
y-v210.125.170.231a.katran.gz
x-v71.56.120.9b.katran.gz
Vježbajte
Neka gore navedene naredbe rade brže pomoću xargs
Pogledajte primjer kako koristiti naredbu xargs u bash skriptama.
Ovaj put se nećemo truditi koristiti bilo koji drugi način sortiranja.
Naredbeni redak
sortiraj -V gutljajimaIzlaz
d-v127.100.108.192.katran.gze-v62.140.229.42a.katran.gz
e-v149.77.211.215a.katran.gz
e-v167.42.221.178b.katran.gz
e-v194.189.236.29a.katran.gz
e-v198.145.199.84b.katran.gz
e-v240.1.147.196b.katran.gz
f-v50.100.142.42b.katran.gz
f-v117.58.230.116.katran.gz
f-v139.17.210.68b.katran.gz
f-v153.18.145.133b.katran.gz
g-v201.153.203.60b.katran.gz
g-v213.58.67.108.katran.gz
h-v5.206.37.224.katran.gz
Sada vidite da sortiranje verzije može biti korisno pri sortiranju imena datoteka s brojevima verzija.
Prethodno sortiraj
Sortiranje ima četiri glavne mogućnosti koje utječu na stvarno sortiranje, naime, -noće-vodeće-prazne, -ignore-case, -ignore-nonprinting i -diction-order, koje se mogu i ne moraju preklapati. Slijedi primjer korištenja svake opcije.
Poredaj zanemarujući vodeće praznine
Sortiranje omogućuje zanemarivanje ulaznih praznih mjesta kao opcije. Vodeći se praznine čuvaju u razvrstanom izlazu.
Opcija
--ignorirati-vodeće-praznineUpotreba
sort --ignore-vodeće-praznineNaredbe
poznati ljudi> fpmačka >> fp << EOF
Marilyn Monroe (1926. - 1962.)
Abraham Lincoln (1809. - 1865.)
EOF
mačka fp | razvrstaj | tac
Izlaz
Alfred Hitchcock (1899. - 1980.)Albert Einstein (1879. - 1955.)
Al Gore (1948. -)
Abraham Lincoln (1809. - 1865.)
Marilyn Monroe (1926. - 1962.)
Abraham Lincoln (1809. - 1865.)
Imajte na umu da se razmaci u redovima dodanim u fp pojavljuju prvi u izlazu sortiranja.
Da bismo to popravili, moramo zanemariti vodeće prazne prostore kako slijedi.
Naredbe
poznati ljudi> fpmačka >> fp << EOF
Marilyn Monroe (1926. - 1962.)
Abraham Lincoln (1809. - 1865.)
EOF
mačka fp | sort --ignore-lead-blanks --ignore-vodeće-praznine | tac
Izlaz
Marilyn Monroe (1926. - 1962.)Marilyn Monroe (1926. - 1962.)
Marija Antoaneta (1755. - 1793.)
..
Albert Einstein (1879. - 1955.)
Al Gore (1948. -)
Abraham Lincoln (1809. - 1865.)
Abraham Lincoln (1809. - 1865.)
Alternative
mačka fp | sed 's / ^ \ s * //' | razvrstaj | tacImajte na umu da alternativa ne čuva vodeće praznine u izlazu sortiranja.
Sortiraj zanemarujući slučaj
Sortiranje omogućuje zanemarivanje velikih i malih slova kao opciju. Slučaj je sačuvan u sortiranom izlazu.
Opcija
--ignorirati-slučajUpotreba
sort --ignore-caseNaredbe
poznati ljudi> fpmačka >> fp << EOF
abraham Lincoln (1809. - 1865.)
ABraham Lincoln (1809. - 1865.)
EOF
mačka fp | razvrstaj | tac
Izlaz
Amelia Earhart (1897. - 1937.)Alfred Hitchcock (1899. - 1980.)
Albert Einstein (1879. - 1955.)
Al Gore (1948. -)
Abraham Lincoln (1809. - 1865.)
ABraham Lincoln (1809. - 1865.)
Imajte na umu da se razmaci u redovima dodanim u fp pojavljuju prvi u izlazu sortiranja.
Da bismo to popravili, moramo zanemariti vodeće prazne prostore kako slijedi.
Naredbe
poznati ljudi> fpmačka >> fp << EOF
abraham Lincoln (1809. - 1865.)
ABraham Lincoln (1809. - 1865.)
EOF
mačka fp | sort --ignore-case | tac
Izlaz
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
mačka fp | dok se čita -r redak; do echo $ linija ,,; gotovo | razvrstaj | tacImajte na umu da alternativa ne čuva velika i mala slova u izlazu sortiranja.
Poredaj zanemarujući neispisivanje
Sortiranje omogućuje zanemarivanje unosa bez ispisa kao opciju. Neispisivanje se čuva u sortiranom izlazu.
Opcija
--ignorirati-neispisivatiUpotreba
sort --ignore-nonprintingNaredbe
poznati ljudi> fpodjek -e "\ x90Abe" >> fp
mačka fp | razvrstaj | tac
Izlaz
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.)
Čini se da nam nedostaje "Abe" za neispisujuće znakove u unosu za sortiranje.
Da bismo to popravili, moramo zanemariti znakove koji se ne ispisuju.
Naredbe
poznati ljudi> fpodjek -e "\ x90Abe" >> fp
mačka fp | sort --ignore-nonprinting | tac
[/ cc \
Izlaz
[cc lang = "bash"]
Amelia Earhart (1897. - 1937.)
Alfred Hitchcock (1899. - 1980.)
Albert Einstein (1879. - 1955.)
Al Gore (1948. -)
Abraham Lincoln (1809. - 1865.)
▒Abe
Poredaj redoslijed rječnika
Sortiranje omogućuje zanemarivanje svih unosa, osim razmaka i alfanumeričkih znakova. Ulaz se čuva u sortiranom izlazu.
poznati ljudi> fpodjek -e "\ x90Abe" >> fp
mačka fp | poredaj --d | tac
Razvrstavanje posta
Sortiranje ima jednu glavnu opciju koja ne utječe na sortiranje, naime, -reverse. Međutim, utječe na izlaz, omogućujući prebacivanje redoslijeda između uzlaznog i silaznog. Slijedi primjer.
Sortiraj obrnuti izlaz
Sortiranje omogućuje prikaz rezultata u obrnutom redoslijedu kao opciju.
Opcija
--obrnutiUpotreba
sortirati - obrnutoNaredbeni redak
poznati ljudi | sortirati - obrnutoIzlaz
Angelina Jolie (1975. -)Amelia Earhart (1897. - 1937.)
Alfred Hitchcock (1899. - 1980.)
Albert Einstein (1879. - 1955.)
Al Gore (1948. -)
Abraham Lincoln (1809. - 1865.)
Alternative
razvrstaj | tacOstale mogućnosti sortiranja
Postoje još dvadeset i dvije mogućnosti sortiranja. Slijede primjeri.
Sortiraj provjeru
Sortiranje ima opciju koja vam omogućuje da provjerite je li ulaz sortiran. Vraća se nakon prvog primjerka nerazvrstane linije. U slučaju da je potrebno sortirati unos, ali je vjerojatno već u redu, primjenom provjere sortiranja je prikladno.
Opcija
--čekUpotreba
sort --checkNaredbeni redak
slijed 10 | sort --random-sort | sort --checkIzlaz
sortiraj: -: 3: poremećaj: 10Naredbeni redak
slijed 10 | sort --random-sort | razvrstaj | sort --checkIzlaz
(prazan)Poredaj izlaz
Sortiranje ima opciju koja vam omogućuje da odredite datoteku u koju želite pisati umjesto da koristite standardni izlaz ili preusmjeravanje. Njegova uporaba može poboljšati kompatibilnost u okruženjima skriptiranja.
Opcija
--izlaz = FILEUpotreba
sort --output = FILENaredbeni redak
slijed 10 | sort --random-sort --output = random-10Izlaz
(prazan)Poredak null završen
Poredaj ima opciju koja vam omogućuje da postavite graničnik reda na nulu umjesto na novi redak.
Opcija
--nula-završenaUpotreba
sort - nula-završenaNaredbeni redak
slijed 10 | tr '\ 012' '\ 000' | sort - nula-završena - random-sortIzlaz
25346178910Sortiraj stabilno
Sortiranje ima opciju koja vam omogućuje onemogućavanje usporedbe u krajnjem slučaju. Kao rezultat, mogu se postići stabilnija vremena izvođenja u slučaju dovoljno velikih ulaza zbog kojih bi sortiranje moglo raditi nestabilno.
Opcija
--stabilanUpotreba
sortirati - stabilnoNaredbeni redak
vremenski slijed 1000000 | sort --random-sort | sort --stable> / dev / nullIzlaz
stvarni 0m9.138korisnik 0m9.201-e
sys 0m0.107-ih
Poredaj veličinu međuspremnika
Sortiranje ima opciju koja vam omogućuje postavljanje količine memorije koja se koristi kao međuspremnik tijekom sortiranja. Može se koristiti za ograničavanje potrošnje memorije sortiranjem većih ulaza. To može utjecati na izvedbu.
Opcija
--veličina međuspremnika = VELIČINAUpotreba
sort --buffer-size = 64Naredbeni redak
vremenski slijed 1000000 | sort -random-sort | sort -stable -buffer-size = 64> / dev / null
Izlaz
stvarni 0m21.685-ihkorisnik 0m9.858-ih
sys 0m2.092s
Poredaj jedinstveno
Sortiranje ima opciju koja vam omogućuje uklanjanje duplikata linija u izlazu sortiranja
Opcija
--jedinstvenUpotreba
sort --uniqueNaredbeni redak odjek 1 2 2 4 5 | tr '\ 040' '\ 000' | vrsta - nula-završena - jedinstvena
Izlaz
1245Alternative
razvrstaj | uniqZaključak
Sortiranje je vanjska naredba korisna ne samo kada se koristi u kombinaciji s drugim vanjskim naredbama, već je korisna i kada se koristi s naredbama bez ugrađene metode naručivanja, poput korisnički definirane funkcije ili bash skripti općenito.