Linux-kommandon

Bash sorteringskommando

Bash sorteringskommando
Lycka till med att försöka implementera en sorteringsalgoritm i bash än avslutas före imorgon. Inga bekymmer, du behöver inte eftersom du har kommandot sort.

Med sortering kan du beställa filer baserat på ordningen i ordboken eller genom numeriskt värde, randomisera filrader, ta bort dubbla rader och kontrollera om en fil är sorterad.

Du kanske kan göra andra saker med det, men först, låt oss oroa oss för att slå in våra huvuden kring hur man använder sortering i bash-skript.

Vad är sortering?

Sortera är ett externt kommando som sammanfogar filer medan de sorterar deras innehåll efter en sorteringstyp och skriver resultat av sortering till standardutdata.

Sortera kommandoalternativ för bash

Sorteringskommandot kommer med 31 alternativ (13 huvud och 18 kategoriserade som andra). De flesta erfarna bash-programmeringar (till och med experter) känner bara till några få huvudsorteringsalternativ som krävs för att klara sig. Andra berörs sällan. Tur för dig att vi har tid att röra vid dem alla.

Huvudsorteringsalternativ

Det här är alternativen som hjälper dig att få saker gjorda och sortera (sortering) förutom att manipulera sorterade resultat (efterbehandling) och tillämpa filter (filter) före sortering.

Sortering

Sortering kommer med 5 olika sorteringar. Här är en tabell som visar varje sorttyp med tillhörande alternativ.

Sortera Kort alternativ / långt alternativ / etc
ord
Numerisk sortering (allmänt) -g / -general-numerisk-sortering
allmänt numeriskt
stöd för vetenskaplig notation
0.1234e4 = 1234
Numerisk sortering (mänsklig) -h / -human-numeric-sort
mänskligt numeriskt
1.234K = 1234
Numerisk -n / -nummer-sortering
numerisk
.. < -1 < 0 < 1 <…
Månad -M / -månadssortering
månad
Okänd < Jan < Feb <… < Nov < Dec
Slumpmässig -r /-slumpmässig sort
slumpmässig
Version -V / -version-sort
version

Observera att varje typ av sort har ett långt alternativ som slutar med -sort. Förutom specifika sorteringsalternativ kan alternativet -sort = WORD användas för att sortera efter ord. Till exempel -sort = slumpmässigt kan användas i stället för -random-sort eller -r.

Exempel

Här är några exempel på sorteringskommandon för varje sorteringsmetod.

Exempel) Sortering av namn

Sortera har inga problem att sortera rader alfabetiskt. Tänk på en lista över kända personer som inte är sorterade.

Fungera

kända människor()

curl --silent https: // www.biografi online.nät / personer / berömd-100.html
| grep efter innehåll | sed -e's /<[^>] *.// g '-e' s / WWII // g '-e' s / \ (Wilbur \)
/ \ 1 Wright / '| grep -o -e '\ (\ ([A-Z] \ + [.] \?\) \ + [a-z] * \ s \) \ + ([0-9] \ + \ s [^)] \+.''

Kommandorad

kända människor | sortera

Produktion

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)

Exempel) Allmän numerisk sortering

Om vi ​​behöver sortera numeriska värden med vetenskaplig notation som 99e2 kan vi använda generell numerisk sortering.

Fungera

osorterade-numeriska värden ()

sek 100 | sortera - slumpmässigt sortera | sed '3i 9e2' | sed '3i 99K'

Tänk på den sorterade produktionen med varje metod. Observera att listan förutom att innehålla värden 1 till 100 också innehåller '9e12' (900) och '99K' (99000).

Kommandorad

osorterade numeriska värden | sortera -n

Produktion

96
97
98
99
99K
100

Vad sägs om 900 och 99000. Det stämmer, det är bara numerisk sortering. Nästa.

Kommandorad

osorterade numeriska värden | sortera -h

Produktion

96
97
98
99
100
99K

Vad sägs om 900. Det stämmer, det är bara mänsklig numerisk sortering. Nästa.

Kommandorad

osorterade numeriska värden | sortera -g

Produktion

96
97
98
99
99K
100
9e2

Vad sägs om 99000. Det stämmer, det är bara generell numerisk sortering. Som ni ser är ingen sorteringsmetod kompatibel i det här fallet; det betyder dock inte att du inte kan komma med en fix.

Kommandorad

osorterade numeriska värden | sed's / [kK] / e3 / '| sortera -g

Produktion

96
97
98
99
100
9e2
99e3

Nu är det mer som det.

Exempel) Mänsklig numerisk sortering

Om vi ​​behöver sortera numeriska värden med hänsyn till betydelsen av notationer som K, G, M och E, kan vi använda mänsklig numerisk sortering.

Kommandorad

sek 100 | sortera - slumpmässig sortering | sed '3i 3k' | sortera -h

Produktion

96
97
98
99
100
3k

Exempel) Numerisk sortering

Om allt vi behöver är att sortera heltal gör numerisk sortering tricket.

Kommandorad

sek 100 | sortera - slumpmässig sortering | sortera - nummer-sortera

Produktion

95
96
97
98
99
100

Exempel) Månadssortering

Månadssortering låter dig beställa rader efter månad. Det kan visa sig vara användbart för att gruppera rader efter månad, särskilt om alternativet att sortera efter tid inte är tillgängligt.

Fungera

månader ()

katt  <Jan
Feb
Mar
Apr
Maj
Juni
Jul
Aug
Sep
Okt
Nov
Dec
EOF

Antag att månader är inte sorterade.

Kommandorad

månader | sortera - slumpmässig sortering

Produktion

Mar
Okt
Dec
Apr
Maj
Sep
Aug
Nov
Jul
Jan
Feb
Juni

Vi kan alltid sortera efter månad.

Kommandorad

månader | sortera - slumpmässigt sortera | sortera - månadsortering

Produktion

Jan
Feb
Mar
Apr
Maj
Juni
Jul
Aug
Sep
Okt
Nov
Dec

Observera att om vi ändrar dec till någon substring i november säger "Novem", kommer det att visas efter "Nov" i den sorterade utdata.

Exempel) Slumpmässig sortering - döda någon annans terminal

Som förväntat, slumpmässig sortering gör motsatsen till sortering, blandar upp linjer.

Antag att vi för utbildningsändamål vill döda en annan användare. Vi måste se till att det inte är vår pty och randomisera listorna så att det är trevligare och att vi kan säga att ptys valdes slumpmässigt.

Kommandon

meddelande-pty ()


lokal pty;
pty = "$ 1"
;
echo -n "Du går ner i"> / dev / $ pty;
för i i 5 4 3 2 1;
do
sova 1;
echo -n "$ i"> / dev / $ pty;
Gjort;
eko "Hejdå!"> / dev / $ pty;
sova 1


ps | grep pty | grep -v -e $ (mypty) | sortera - slumpmässigt sortera | huvud -1> stdin;

meddelande-pty $ (pty < stdin );
döda $ (pid < stdin )


Output i någon annans terminal
Du går ner i 5 4 3 2 1 Hejdå!]
(utgång)

Exempel) Versionsortering - sorterings-ips

Som du vet kan källfiler versioneras med strängar som 1.0. Dessutom kan versioner gå djupare med versionsnummer som 1.0.0 som ses i populära semantiska versioner.

Versionssortering låter dig sortera versionsnummer. Bra! Nu då? Låt oss testa det.

För det här exemplet har jag förberett ett bash-skript för att generera slumpmässiga ips så att vi inte behöver åka dit. Det är i repo. För de av oss som inte har repo här är en snabb start.

Kommandon

git klon https: // github.com / temptemp3 / linuxhint.com.git
alias random-ips = 'test -f "linuxhint.com / generera-slumpmässiga ips.sh "; bash $ _ '

Nu när du är redo ska vi komma igång.

Kommandorad

random-ips 200 | tee ips

Produktion

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

Okej, det fungerar. Låt oss nu se vad som händer när vi försöker sortera ips.

Kommandorad

sortera ips

Produktion

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

Vid första anblicken verkar det fungera men linjer som 8.96.11.181 bör visas någon annanstans.

Kommandon


för o i d h n V g M
do
sortera ips - $ o> ips $ o ,,
Gjort

eko alla sorter lika numerisk sortering
diff ips n, d 1> / dev / null || eko ordbok ordning != numerisk sortering
diff ips n, h 1> / dev / null || eko mänsklig numerisk sortering != numerisk sortering
diff ips n, g 1> / dev / null || eko generell numerisk sortering != numerisk sortering
diff ips n, v 1> / dev / null ||
echo version sort != numerisk sortering
show_n_v_ips_diff = "sant"


testa ! "$ show_n_v_ips_diff" || diff ips n, v

Produktion

alla slags lika numeriska sorter
ordbok ordning != numerisk sortering
version sortera != numerisk sortering
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

Som du ser version sort kan du sortera versionsnummer när andra sorteringsmetoder misslyckas.

Exempel) Versionssortering - sortering av filnamn med versionsnummer

Baserat på det sista exemplet, låt oss använda version sortera lite närmare dess avsedda användning. Som ni vet visas versionsnummer ofta i filnamn. Se Detaljer om sortering av versioner.

Låt oss först omvandla ips till något annat mer projektkällfil som.

Kommandon

alfa ()
alfa = "abcdefghijklmnopqrstuvwxyz";
eko -n $ alfa: $ ((RANDOM% 26)): 1

beta ()
alfa = "ab";
eko -n $ alfa: $ ((RANDOM% 2)): 1


katt-ips | medan läs -r rad; do
echo $ (alpha) -v $ line $ (test $ ((RANDOM% 5)) -eq 0 || beta).tjära.gz;
gjort | tee sips

Produktion

x-v56.16.109.54.tjära.gz
k-v117.38.14.165a.tjära.gz
d-v87.59.32.91a.tjära.gz
h-v115.215.64.100.tjära.gz
s-v72.174.246.218b.tjära.gz
h-v163.93.19.173.tjära.gz
u-v184.225.11.92b.tjära.gz
y-v205.53.5.211a.tjära.gz
t-v175.196.164.17b.tjära.gz
e-v167.42.221.178b.tjära.gz
c-v126.54.190.189b.tjära.gz
b-v169.180.221.131a.tjära.gz
y-v210.125.170.231a.tjära.gz
x-v71.56.120.9b.tjära.gz

Övning

Gör ovanstående kommandon snabbare med xargs

Se exempel på hur man använder kommandot xargs i bash-skript.

Den här gången kommer vi inte ens bry oss om att använda någon av de andra sorteringsmetoderna.

Kommandorad

sortera -V sippar

Produktion

d-v127.100.108.192.tjära.gz
e-v62.140.229.42a.tjära.gz
e-v149.77.211.215a.tjära.gz
e-v167.42.221.178b.tjära.gz
e-v194.189.236.29a.tjära.gz
e-v198.145.199.84b.tjära.gz
e-v240.1.147.196b.tjära.gz
f-v50.100.142.42b.tjära.gz
f-v117.58.230.116.tjära.gz
f-v139.17.210.68b.tjära.gz
f-v153.18.145.133b.tjära.gz
g-v201.153.203.60b.tjära.gz
g-v213.58.67.108.tjära.gz
h-v5.206.37.224.tjära.gz

Nu ser du att versionssortering kan vara användbar när du sorterar filnamn med versionsnummer.

Försortera

Sortering har fyra huvudalternativ som påverkar faktisk sortering, nämligen -ignore-leading-blank, -ignore-case, -ignore-nonprinting och -diction-order, som kanske eller inte kan överlappa. Exempel på varje alternativ följ.

Sortera ignorerande ledande ämnen

Sortering gör att ingående ledande ämnen kan ignoreras som ett alternativ. Ledande ämnen bevaras i den sorterade utgången.

Alternativ

--ignorera-ledande ämnen

Användande

sortera - stora ledande ämnen

Kommandon

kända personer> fp
katt >> fp << EOF
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)
EOF
katt fp | sortera | tac

Produktion

Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)

Observera att ledande mellanslag i rader som läggs till i fp visas först i sorteringsutdata.

För att åtgärda detta måste vi ignorera ledande ämnen enligt följande.

Kommandon

kända personer> fp
katt >> fp << EOF
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)
EOF
katt fp | sort --ignore-leading-blanks --ignore-leading-blanks | tac

Produktion

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)

Alternativ

katt fp | sed 's / ^ \ s * //' | sortera | tac

Observera att alternativet inte bevarar ledande ämnen i sorteringsutdata.

Sortera ignoreringsfall

Sortering gör att inmatningsfall kan ignoreras som ett alternativ. Fallet bevaras i den sorterade utdata.

Alternativ

--ignorera fall

Användande

sort --ignore-case

Kommandon

kända personer> fp
katt >> fp << EOF
abraham Lincoln (1809 - 1865)
ABraham Lincoln (1809 - 1865)
EOF
katt fp | sortera | tac

Produktion

Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)
ABraham Lincoln (1809 - 1865)

Observera att ledande mellanslag i rader som läggs till i fp visas först i sorteringsutdata.

För att åtgärda detta måste vi ignorera ledande ämnen enligt följande.

Kommandon

kända personer> fp
katt >> fp << EOF
abraham Lincoln (1809 - 1865)
ABraham Lincoln (1809 - 1865)
EOF
katt fp | sort --ignore-case | tac

Produktion

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)

Alternativ

katt fp | medan läs -r rad; echo $ line ,,; gjort | sortera | tac

Observera att alternativet inte behåller skiftläge i sorteringsutdata.

Sortera ignorerar icke-utskrift

Sortering gör att inmatning utan utskrift kan ignoreras som ett alternativ. Icke-utskrift bevaras i den sorterade utdata.

Alternativ

--ignorera-icke-utskrift

Användande

sortera --ignore-nonprinting

Kommandon

kända personer> fp
eko -e "\ x90Abe" >> fp
katt fp | sortera | tac

Produktion

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)

Det verkar som om vi saknar ett 'Abe' -arbete för tecken som inte skrivs ut i sorteringsinmatning.

För att åtgärda detta måste vi ignorera tecken som inte skrivs ut.

Kommandon

kända personer> fp
eko -e "\ x90Abe" >> fp
katt fp | sortera --ignore-nonprinting | tac
[/ cc \
Produktion
[cc lang = "bash"]
Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)
BeAbe

Sortera ordbokens ordning

Sortering tillåter att alla inmatningar ignoreras utom mellanslag och alfanumeriska tecken som ett alternativ. Ingången bevaras i den sorterade utdata.

kända personer> fp
eko -e "\ x90Abe" >> fp
katt fp | sortera --d | tac

Post sortera

Sortering har ett huvudalternativ som inte påverkar sorteringen, nämligen -omvänd. Det påverkar emellertid utdata, så att ordning kan växlas mellan stigande och fallande. Ett exempel följer.

Sortera omvänd utdata

Sortering gör att utdata kan visas i omvänd ordning som ett alternativ.

Alternativ

--omvänd

Användande

sortera - omvänd

Kommandorad

kända människor | sortera - omvänd

Produktion

Angelina Jolie (1975 -)
Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)

Alternativ

sortera | tac

Andra sorteringsalternativ

Det finns tjugotvå andra alternativ för sortering. Exempel följer.

Sorteringskontroll

Sortering har ett alternativ som låter dig kontrollera om ingången är sorterad. Den återkommer efter den första instansen av en osorterad rad. Det är fallet att ingången måste sorteras men sannolikt redan är i ordning, med hjälp av sorteringskontroll är lämpligt.

Alternativ

--kolla upp

Användande

sortera --kolla

Kommandorad

seq 10 | sortera - slumpmässig sortering | sortera --kolla

Produktion

sortera: -: 3: störning: 10

Kommandorad

seq 10 | sortera - slumpmässig sortering | sortera | sortera --kolla

Produktion

(tom)

Sortera utdata

Sortera har ett alternativ som låter dig ange en fil att skriva till istället för att använda standardutdata eller omdirigering. Dess användning kan förbättra kompatibiliteten mellan skriptmiljöer.

Alternativ

--output = FIL

Användande

sortera --output = FIL

Kommandorad

seq 10 | sortera - slumpmässig sortering - utdata = slumpmässig-10

Produktion

(tom)

Sortera null avslutad

Sortering har ett alternativ som låter dig ställa in linjeavgränsaren till null istället för en ny rad.

Alternativ

--nollavslutad

Användande

sortera - nollavslutad

Kommandorad

seq 10 | tr '\ 012' '\ 000' | sortera - nollavslutad - slumpmässig sortering

Produktion

25346178910

Sortera stabilt

Sortera har ett alternativ som gör att du kan inaktivera jämförelse mellan sista utväg. Som ett resultat kan mer stabila driftstider uppnås i fallet med tillräckligt stora ingångar som kan få sorten att köra instabil.

Alternativ

--stabil

Användande

sortera - stabil

Kommandorad

tid seq 1000000 | sortera - slumpmässig sortering | sort --stable> / dev / null

Produktion

verklig 0m9.138-talet
användare 0m9.201-talet
sys 0m0.107-talet

Sortera buffertstorlek

Sortering har ett alternativ som låter dig ställa in mängden minne som används som buffert vid sortering. Den kan användas för att begränsa minnesförbrukningen genom att sortera större ingångar. Prestanda kan påverkas.

Alternativ

--buffertstorlek = STORLEK

Användande

sortera - buffertstorlek = 64

Kommandorad

tid seq 1000000 | sortera-slumpmässigt-sortera | sortera -stabil -buffer-size = 64> / dev / null

Produktion

verklig 0m21.685s
användare 0m9.858s
sys 0m2.092s

Sortera unikt

Sortera har ett alternativ som låter dig ta bort dubbla rader i sorteringsutdata

Alternativ

--unik

Användande

sortera - unikt

Kommandorad

eko 1 2 2 4 5 | tr '\ 040' '\ 000' | sortera - nollavslutad - unik

Produktion

1245

Alternativ

sortera | uniq

Slutsats

Sortera är ett externt kommando som inte bara är användbart när det används i kombination med andra externa kommandon utan också användbart när det används med kommandon utan inbyggd beställningsmetod som en användardefinierad funktion eller bash-skript i allmänhet.

Bästa spelkonsolemulatorer för Linux
Den här artikeln listar populära spelkonsolemuleringsprogram som finns tillgängliga för Linux. Emulation är ett mjukvarukompatibilitetsskikt som emule...
Bästa Linux Distros för spel 2021
Linux-operativsystemet har kommit långt från sitt ursprungliga, enkla, serverbaserade utseende. Detta operativsystem har förbättrats enormt de senaste...
Hur du fångar och strömmar din spelsession på Linux
Tidigare betraktades spel bara som en hobby, men med tiden såg spelindustrin en enorm tillväxt när det gäller teknik och antalet spelare. Spelpubliken...