Linux-kommandoer

Bash sorteringskommando

Bash sorteringskommando
Lykke til med å prøve å implementere en sorteringsalgoritme i bash enn ferdig før i morgen. Ingen bekymringer, du trenger ikke det fordi du har sorteringskommandoen.

Med sortering kan du bestille filer basert på rekkefølgen i ordboken eller etter numerisk verdi, randomisere fillinjer, fjerne duplikatlinjer og sjekke om en fil er sortert.

Du kan kanskje gjøre andre ting med det, men la oss først bekymre deg for å pakke hodet rundt hvordan vi kan bruke sortering i bash-skript.

Hva er sortering??

Sortering er en ekstern kommando som sammenkobler filer mens de sorterer innholdet etter en sorteringstype og skriver resultatene av sorteringen til standardutdata.

Sorter kommandoalternativer for bash

Sorteringskommandoen kommer med 31 alternativer (13 hoved og 18 kategorisert som andre). Mest erfarne bash-programmering (til og med eksperter) kjenner bare noen få hovedsorteringsalternativer som kreves for å klare seg. Andre blir sjelden berørt. Heldig for deg vi har tid til å ta på dem alle.

Hovedsorteringsalternativer

Dette er alternativene som hjelper deg med å få ting gjort og sortere (Sortering) i tillegg til å manipulere sorterte resultater (Etterbehandling) og bruke filtre (Filtre) før sortering.

Sortering

Sortering kommer med 5 forskjellige typer sortering. Her er en tabell som viser hver sorteringstype med tilhørende alternativer.

Sortere Kort alternativ / langt alternativ / etc
ord
Numerisk sortering (generelt) -g / -general-numerisk-sort
generell-numerisk
støtte for vitenskapelig notasjon
0.1234e4 = 1234
Numerisk sortering (menneskelig) -h / -human-numeric-sort
menneskelig-numerisk
1.234K = 1234
Numerisk -n / -nummer-sortering
numerisk
.. < -1 < 0 < 1 <…
Måned -M / -månedsortering
måned
Ukjent < Jan < Feb <… < Nov < Dec
Tilfeldig -r / -random-sort
tilfeldig
Versjon -V / -versjon-sortering
versjon

Merk at hver type type har et langt alternativ som slutter med -sort. I tillegg til spesifikke sorteringsalternativer, kan alternativet -sort = WORD brukes til å sortere etter ord. For eksempel kan -sort = random brukes i stedet for -random-sort eller -r.

Eksempler

Her er noen eksempler på sorteringskommandoer for hver sorteringsmetode.

Eksempel) Sortering av navn

Sortering har ingen problemer med å sortere linjer alfabetisk. Vurder en liste over kjente personer som ikke er sortert.

Funksjon

berømte mennesker()

krøll - stille https: // www.biografi på nettet.nett / folk / berømt-100.html
| grep etter innhold | sed -e's /<[^>] *.// g '-e' s / WWII // g '-e' s / \ (Wilbur \)
/ \ 1 Wright / '| grep -o -e '\ (\ ([A-Z] \ + [.] \?\) \ + [a-z] * \ s \) \ + ([0-9] \ + \ s [^)] \+.'

Kommandolinje

kjente personer | sortere

Produksjon

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)

Eksempel) Generell numerisk sortering

Hvis vi trenger å sortere numeriske verdier med vitenskapelig betegnelse som 99e2, kan vi bruke generell numerisk sortering.

Funksjon

usorterte numeriske verdier ()

seq 100 | sorter - tilfeldig-sorter | sed '3i 9e2' | sed '3i 99K'

Vurder det sorterte resultatet ved hjelp av hver metode. Merk at listen i tillegg til å inneholde verdiene 1 til 100, også inneholder '9e12' (900) og '99K' (99000).

Kommandolinje

usorterte numeriske verdier | sorter -n

Produksjon

96
97
98
99
99K
100

Hva med 900 og 99000. Det stemmer, det er bare numerisk sortering. Neste.

Kommandolinje

usorterte numeriske verdier | sorter -h

Produksjon

96
97
98
99
100
99K

Hva med 900. Det stemmer, det er bare menneskelig numerisk sortering. Neste.

Kommandolinje

usorterte numeriske verdier | sorter -g

Produksjon

96
97
98
99
99K
100
9e2

Hva med 99000. Det stemmer, det er bare generell numerisk sortering. Som du ser er ingen sorteringsmetode kompatibel i dette tilfellet; Det betyr imidlertid ikke at du ikke kan komme med en løsning.

Kommandolinje

usorterte numeriske verdier | sed 's / [kK] / e3 /' | sorter -g

Produksjon

96
97
98
99
100
9e2
99e3

Nå er det mer som det.

Eksempel) Menneskelig numerisk sortering

Hvis vi trenger å sortere numeriske verdier med tanke på betydningen av notasjoner som K, G, M og E, kan vi bruke menneskelig numerisk sortering.

Kommandolinje

seq 100 | sorter - tilfeldig-sorter | sed '3i 3k' | sorter -h

Produksjon

96
97
98
99
100
3k

Eksempel) Numerisk sortering

Hvis alt vi trenger er å sortere heltall numerisk sortering gjør susen.

Kommandolinje

seq 100 | sorter - tilfeldig-sorter | sorter - nummer-sorter

Produksjon

95
96
97
98
99
100

Eksempel) Månedssortering

Månedsortering lar deg bestille linjer etter måned. Det kan være nyttig for gruppering av linjer etter måned, spesielt i tilfelle at muligheten for å sortere etter tid ikke er tilgjengelig.

Funksjon

måneder ()

katt  <Jan
Feb
Mar
Apr
Kan
Jun
Jul
Aug
Sep
Okt
Nov
Des
EOF

Anta at det er måneder, blir ikke sortert.

Kommandolinje

måneder | sorter - tilfeldig-sorter

Produksjon

Mar
Okt
Des
Apr
Kan
Sep
Aug
Nov
Jul
Jan
Feb
Jun

Vi kan alltid sortere etter måned.

Kommandolinje

måneder | sorter - tilfeldig-sortering | sorter - månedssortering

Produksjon

Jan
Feb
Mar
Apr
Kan
Jun
Jul
Aug
Sep
Okt
Nov
Des

Merk at hvis vi endrer desember til en hvilken som helst understreng i november, sier 'Novem', vil den vises etter 'Nov' i den sorterte utgangen.

Eksempel) Tilfeldig sortering - drep en andres terminal

Som forventet gjør tilfeldig sorter det motsatte av sortering, blander linjer.

Anta at vi for utdanningsformål vil drepe en annen bruker. Vi må sørge for at det ikke er vår pty og randomisere oppføringene slik at de er bedre og at vi kan si at PTY er valgt tilfeldig.

Kommandoer

melding-pty ()


lokal pty;
pty = "$ 1"
;
ekko -n "Du skal ned i"> / dev / $ pty;
for i i 5 4 3 2 1;
gjøre
sove 1;
ekko -n "$ i"> / dev / $ pty;
gjort;
ekko "Bye!"> / dev / $ pty;
sove 1


ps | grep pty | grep -v -e $ (mypty) | sorter - tilfeldig-sortering | hode -1> stdin;

melding-pty $ (pty < stdin );
drep $ (pid < stdin )


Utgang i andres terminal
Du går ned i 5 4 3 2 1 Bye!]
(exit)

Eksempel) Versjonssortering - sortering av ips

Som du vet kan kildefiler versjoneres ved hjelp av strenger som 1.0. Videre kan versjoner gå dypere med versjonsnumre som 1.0.0 slik som sett i populære semantiske versjonsskjemaer.

Versjonssortering lar deg sortere versjonsnumre. Flott! Hva nå? La oss teste det ut.

For dette eksemplet har jeg utarbeidet et bash-skript for å generere tilfeldige ips slik at vi ikke trenger å dra dit. Det er i repoen. For de av oss som ikke har repoen, er det en rask start.

Kommandoer

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

Nå som du er klar, la oss komme i gang.

Kommandolinje

random-ips 200 | tee ips

Produksjon

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

Det fungerer. La oss nå se hva som skjer når vi prøver å sortere ips.

Kommandolinje

sorter ips

Produksjon

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

Ved første øyekast ser det ut til å fungere, men linjer som 8.96.11.181 skal vises andre steder.

Kommandoer


for o i d h n V g M
gjøre
sorter ips - $ o> ips $ o ,,
ferdig

ekko alle slags like numeriske sorter
diff ips n, d 1> / dev / null || ekko ordbok rekkefølge != numerisk sortering
diff ips n, h 1> / dev / null || ekko menneskelig numerisk sortering != numerisk sortering
diff ips n, g 1> / dev / null || ekko generell numerisk sortering != numerisk sortering
diff ips n, v 1> / dev / null ||
ekko versjon sorter != numerisk sortering
show_n_v_ips_diff = "true"


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

Produksjon

alle slags like numeriske sorter
ordbokrekkefølge != numerisk sortering
versjonssortering != 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, kan versjon sortere deg sortere versjonsnumre når andre sorteringsmetoder mislykkes.

Eksempel) Versjonssortering - sortering av filnavn med versjonsnumre

Basert på det siste eksemplet, la oss bruke versjonen sortere litt nærmere den tiltenkte bruken. Som du vet, vises versjonsnumre ofte i filnavn. Se Detaljer om versjonssortering.

La oss først forvandle ips til noe annet mer prosjektkildefil.

Kommandoer

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

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


katt-ips | mens du leser -r linje; gjøre
ekko $ (alpha) -v $ line $ (test $ ((RANDOM% 5)) -eq 0 || beta).tjære.gz;
ferdig | tee slurker

Produksjon

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

Trening

Gjør ovennevnte kommandoer raskere ved hjelp av xargs

Se eksempel på hvordan du bruker xargs-kommandoen i bash-skript.

Denne gangen gidder vi ikke engang å bruke noen av de andre sorteringsmetodene.

Kommandolinje

sorter -V nipper

Produksjon

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

Nå ser du at versjonssortering kan være nyttig når du sorterer filnavn med versjonsnummer.

Forhåndssorter

Sortering har fire hovedalternativer som påvirker faktisk sortering, nemlig -ignore-leading-blanks, -ignore-case, -ignore-nonprinting og -diction-order, som kanskje eller ikke overlapper. Eksempel på bruk av hvert alternativ følger.

Sorter ignorering av ledende emner

Sortering gjør det mulig å ignorere inngangsledende emner som et alternativ. Ledende emner er bevart i den sorterte utgangen.

Alternativ

--ignorere-ledende-blanks

Bruk

sorter - store ledere

Kommandoer

kjente personer> fp
katt >> fp << EOF
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)
EOF
katt fp | sorter | tac

Produksjon

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

Merk at ledende mellomrom i linjer lagt til fp vises først i sorteringsutdata.

For å fikse dette må vi ignorere ledende emner som følger.

Kommandoer

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

Produksjon

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)

Alternativer

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

Merk at alternativet ikke bevarer ledende emner i sorteringsutdata.

Sorter ignoreringstilfelle

Sortering gjør at inndatasak kan ignoreres som et alternativ. Saken er bevart i den sorterte utdata.

Alternativ

--ignorere saken

Bruk

sorter - stor sak

Kommandoer

kjente personer> fp
katt >> fp << EOF
Abraham Lincoln (1809 - 1865)
ABraham Lincoln (1809 - 1865)
EOF
katt fp | sorter | tac

Produksjon

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

Merk at ledende mellomrom i linjer lagt til fp vises først i sorteringsutdata.

For å fikse dette må vi ignorere ledende emner som følger.

Kommandoer

kjente personer> fp
katt >> fp << EOF
Abraham Lincoln (1809 - 1865)
ABraham Lincoln (1809 - 1865)
EOF
katt fp | sort --ignore-case | tac

Produksjon

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)

Alternativer

katt fp | mens du leser -r linje; gjør ekko $ line ,,; ferdig | sorter | tac

Merk at alternativet ikke bevarer store og små bokstaver i sorteringsutdata.

Sorter ignorering uten utskrift

Sortering gjør at ikke-utskrift av input kan ignoreres som et alternativ. Ikke-utskrift bevares i den sorterte utdataene.

Alternativ

--ignorere-ikke-utskrift

Bruk

sort --ignore-nonprinting

Kommandoer

kjente mennesker> fp
ekko -e "\ x90Abe" >> fp
katt fp | sorter | tac

Produksjon

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 ser ut til at vi mangler et 'Abe' -gjenstand mot tegn som ikke skrives ut i sorteringsinndata.

For å fikse dette må vi ignorere tegn som ikke er utskrift.

Kommandoer

kjente mennesker> fp
ekko -e "\ x90Abe" >> fp
katt fp | sort --ignore-nonprinting | tac
[/ cc \
Produksjon
[cc lang = "bash"]
Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)
▒Abe

Sorter ordboksrekkefølgen

Sortering lar alle inndata ignoreres, unntatt mellomrom og alfanumeriske tegn som et alternativ. Inndata bevares i den sorterte utgangen.

kjente personer> fp
ekko -e "\ x90Abe" >> fp
katt fp | sorter - d | tac

Innleggssortering

Sortering har ett hovedalternativ som ikke påvirker sortering, nemlig -omvendt. Imidlertid påvirker det utdataene, slik at rekkefølge kan byttes mellom stigende og synkende. Et eksempel følger.

Sorter omvendt utdata

Sortering gjør at utdata kan vises i omvendt rekkefølge som et alternativ.

Alternativ

--omvendt

Bruk

sorter - omvendt

Kommandolinje

kjente personer | sorter - omvendt

Produksjon

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

Alternativer

sorter | tac

Andre alternativer for sortering

Det er tjueto andre alternativer for sortering. Eksempler følger.

Sorter sjekk

Sortering har et alternativ som lar deg sjekke om inngangen er sortert. Den returnerer etter første forekomst av en usortert linje. Det er tilfelle at input kreves sortert, men sannsynligvis allerede er i orden, og bruk av sorteringskontroll er passende.

Alternativ

--Sjekk

Bruk

sorter - sjekk

Kommandolinje

seq 10 | sorter - tilfeldig-sorter | sorter - sjekk

Produksjon

sorter: -: 3: lidelse: 10

Kommandolinje

seq 10 | sorter - tilfeldig-sorter | sorter | sorter - sjekk

Produksjon

(blank)

Sorter utdata

Sort har et alternativ som lar deg spesifisere en fil å skrive til i stedet for å bruke standard utdata eller omdirigering. Bruken av den kan forbedre kompatibiliteten i skriptmiljøer.

Alternativ

--utgang = FIL

Bruk

sorter - utgang = FIL

Kommandolinje

seq 10 | sorter - tilfeldig sorter - utgang = tilfeldig-10

Produksjon

(blank)

Sorter null avsluttet

Sort har et alternativ som lar deg sette linjeavgrenseren til null i stedet for en ny linje.

Alternativ

--null-avsluttet

Bruk

sorter - null-avsluttet

Kommandolinje

seq 10 | tr '\ 012' '\ 000' | sorter - null-avsluttet - tilfeldig-sorter

Produksjon

25346178910

Sorter stabilt

Sort har et alternativ som lar deg deaktivere sammenligning av siste utvei. Som et resultat kan mer stabile kjøretider oppnås i tilfelle store nok innganger som kan føre til at sort kjører ustabil.

Alternativ

--stabil

Bruk

sorter - stabil

Kommandolinje

tid seq 1000000 | sorter - tilfeldig-sorter | sorter - stabil> / dev / null

Produksjon

ekte 0m9.138-tallet
bruker 0m9.201-tallet
sys 0m0.107-tallet

Sorter bufferstørrelse

Sortering har et alternativ som lar deg angi hvor mye minne som skal brukes som buffer mens du sorterer. Den kan brukes til å begrense minneforbruk ved å sortere større innganger. Ytelsen kan bli påvirket.

Alternativ

--bufferstørrelse = STØRRELSE

Bruk

sorter - bufferstørrelse = 64

Kommandolinje

tid seq 1000000 | sorter-tilfeldig-sorter | sorter -stabil -buffer-size = 64> / dev / null

Produksjon

ekte 0m21.685s
bruker 0m9.858-tallet
sys 0m2.092-tallet

Sorter unikt

Sortering har et alternativ som lar deg fjerne dupliserte linjer i sorteringsutdata

Alternativ

--unik

Bruk

sorter - unik

Kommandolinje

ekko 1 2 2 4 5 | tr '\ 040' '\ 000' | sorter - null-avsluttet - unik

Produksjon

1245

Alternativer

sorter | uniq

Konklusjon

Sortering er en ekstern kommando som er nyttig ikke bare når den brukes i kombinasjon med andre eksterne kommandoer, men er også nyttig når den brukes med kommandoer uten innebygd bestillingsmetode, for eksempel en brukerdefinert funksjon eller bash-skript generelt.

Mus WinMouse lar deg tilpasse og forbedre musemarkørenes bevegelse på Windows PC
WinMouse lar deg tilpasse og forbedre musemarkørenes bevegelse på Windows PC
Hvis du vil forbedre standardfunksjonene til musepekeren, bruk freeware WinMouse. Det legger til flere funksjoner som hjelper deg å få mest mulig ut a...
Mus Mus venstreklikknapp fungerer ikke på Windows 10
Mus venstreklikknapp fungerer ikke på Windows 10
Hvis du bruker en dedikert mus med den bærbare eller stasjonære datamaskinen, men museklikk-knappen fungerer ikke på Windows 10/8/7 av en eller annen ...
Mus Markøren hopper eller beveger seg tilfeldig mens du skriver inn Windows 10
Markøren hopper eller beveger seg tilfeldig mens du skriver inn Windows 10
Hvis du finner ut at musemarkøren hopper eller beveger seg alene, automatisk, tilfeldig mens du skriver inn Windows-bærbar PC eller datamaskin, kan no...