Linux-opdrachten

Bash-sorteeropdracht

Bash-sorteeropdracht
Veel succes met het implementeren van een sorteeralgoritme in bash dan klaar is voor morgen. Geen zorgen, dat is niet nodig, want je hebt het sorteercommando.

Met sorteren kunt u bestanden ordenen op basis van de volgorde in het woordenboek of op numerieke waarde, bestandsregels willekeurig maken, dubbele regels verwijderen en controleren of een bestand is gesorteerd.

Je kunt er misschien andere dingen mee doen, maar laten we ons eerst zorgen maken over hoe we sorteren in bash-scripts kunnen gebruiken.

Wat is sorteren??

Sorteren is een externe opdracht die bestanden samenvoegt terwijl de inhoud wordt gesorteerd volgens een sorteertype en de resultaten van de sortering naar de standaarduitvoer schrijft.

Sorteer opdrachtopties voor bash

De sorteeropdracht wordt geleverd met 31 opties (13 hoofd- en 18 gecategoriseerd als andere). De meeste ervaren bash-programmering (zelfs experts) kennen slechts een paar hoofdsorteeropties die nodig zijn om rond te komen. Anderen worden zelden aangeraakt. Gelukkig voor jou hebben we tijd om ze allemaal aan te raken.

Belangrijkste sorteeropties

Dit zijn de opties die u helpen dingen voor elkaar te krijgen en te sorteren (Sorteren) naast het manipuleren van gesorteerde resultaten (Naverwerking) en het toepassen van filters (Filters) voorafgaand aan het sorteren.

Sorteren

Sorteren wordt geleverd met 5 verschillende soorten sortering. Hier is een tabel met elk sorteertype met bijbehorende opties:.

Soort Korte optie / lange optie / etc
woord
Numerieke sortering (algemeen) -g / -algemeen-numeriek-sorteren
algemeen-numeriek
ondersteuning voor wetenschappelijke notatie
0.1234e4 = 1234
Numerieke sortering (mens) -h / -menselijk-numeriek-sorteren
mens-numeriek
1.234K = 1234
Numeriek -n / -numeriek-sorteren
numeriek
… < -1 < 0 < 1 <…
Maand -M / -maand-sort
maand
Onbekend < Jan < Feb <… < Nov < Dec
Willekeurig -r / -willekeurig-sorteren
willekeurig
Versie -V / -versie-sort
versie

Merk op dat elk type sortering een lange optie heeft die eindigt op -sort. Naast specifieke sorteeropties, kan de -sort=WORD-optie worden gebruikt om op woord te sorteren. Bijvoorbeeld -sort=random kan worden gebruikt in plaats van -random-sort of -r.

Voorbeelden

Hier zijn enkele voorbeelden van sorteeropdrachten voor elke sorteermethode:.

Voorbeeld) Namen sorteren

Sorteren heeft geen problemen om regels alfabetisch te sorteren. Overweeg een lijst met bekende mensen die niet gesorteerd zijn.

Functie

beroemde mensen()

krul --stil https://www.biografieonline.netto/mensen/beroemd-100.html
| grep post-content | sed -e 's/<[^>]*.//g' -e 's/WWII//g' -e 's/\(Wilbur\)
/\1 Wright/'| grep -o -e '\(\([A-Z]\+[.]\?\)\+[a-z]*\s\)\+([0-9]\+\s[^)]\+.'

Opdrachtregel

beroemde mensen | soort

Uitgang:

Stephen King (1947 - )
Steve Jobs (1955 - 2012)
Steek (1951 - )
Tijgerhout (1975 - )
Tom Cruise (1962 - )
Usain Bout (1986 - )
Vinci (1452 - 1519)
Walt Disney (1901 - 1966)
Wilbur Wright (1867 - 1912)
Woodrow Wilson (1856 - 1924)

Voorbeeld) Algemene numerieke sortering

Als we numerieke waarden moeten sorteren met wetenschappelijke notatie zoals 99e2, kunnen we algemene numerieke sortering gebruiken.

Functie

ongesorteerde-numerieke-waarden ()

volgende 100 | sorteren --willekeurig sorteren | sed '3i 9e2' | sed '3i 99K'

Overweeg de gesorteerde uitvoer met behulp van elke methode. Merk op dat de lijst niet alleen de waarden 1 tot en met 100 bevat, maar ook '9e12' (900) en '99K' (99000).

Opdrachtregel

ongesorteerde-numerieke-waarden | sorteren -n

Uitgang:

96
97
98
99
99K
100

Hoe zit het met 900 en 99000. Dat klopt, het is gewoon numeriek sorteren. De volgende.

Opdrachtregel

ongesorteerde-numerieke-waarden | sorteer -h

Uitgang:

96
97
98
99
100
99K

Hoe zit het met 900. Dat klopt, het is gewoon menselijke numerieke sortering. De volgende.

Opdrachtregel

ongesorteerde-numerieke-waarden | sorteer -g

Uitgang:

96
97
98
99
99K
100
9e2

Hoe zit het met 99000. Dat klopt, het is gewoon een algemene numerieke sortering. Zoals u ziet, is in dit geval geen enkele sorteermethode compatibel; dat betekent echter niet dat je geen oplossing kunt bedenken.

Opdrachtregel

ongesorteerde-numerieke-waarden | sed 's/[kK]/e3/' | sorteer -g

Uitgang:

96
97
98
99
100
9e2
99e3

Nu lijkt het er meer op.

Voorbeeld) Menselijke numerieke sortering

Als we numerieke waarden moeten sorteren rekening houdend met de betekenis van notaties zoals K, G, M en E, kunnen we menselijke numerieke sortering gebruiken.

Opdrachtregel

volgende 100 | sorteren --willekeurig sorteren | sed '3i 3k' | sorteer -h

Uitgang:

96
97
98
99
100
3k

Voorbeeld) Numerieke sortering

Als alles wat we nodig hebben is om gehele getallen te sorteren, is numeriek sorteren voldoende.

Opdrachtregel

volgende 100 | sorteren --willekeurig sorteren | sorteren --numerics-sort

Uitgang:

95
96
97
98
99
100

Voorbeeld) Maand sorteren

Met maandsortering kunt u regels per maand bestellen. Het kan handig zijn om regels per maand te groeperen, vooral in het geval dat de optie om op tijd te sorteren niet beschikbaar is.

Functie

maanden ()

kat  <Jan
februari
maart
april
mei
juni
juli
augustus
september
okt
november
december
EOF

Stel dat maanden niet zijn gesorteerd.

Opdrachtregel

maanden | sorteren --willekeurig sorteren

Uitgang:

maart
okt
december
april
mei
september
augustus
november
juli
Jan
februari
juni

We kunnen altijd op maand sorteren.

Opdrachtregel

maanden | sorteren --willekeurig sorteren | sorteren --maand-sort

Uitgang:

Jan
februari
maart
april
mei
juni
juli
augustus
september
okt
november
december

Merk op dat als we Dec in een substring in november veranderen, zeg 'Novem', het zal verschijnen na 'Nov' in de gesorteerde uitvoer.

Voorbeeld) Willekeurige sortering - dood de terminal van iemand anders

Zoals verwacht, doet willekeurig sorteren het tegenovergestelde van sorteren, haalt lijnen door elkaar.

Stel dat we voor educatieve doeleinden een andere gebruiker willen vermoorden. We zouden ervoor moeten zorgen dat het niet onze pty is en de lijsten willekeurig maken zodat het leuker is en dat we kunnen zeggen dat pty's willekeurig zijn geselecteerd.

Commando's

bericht-pty ()


lokale pty;
pty="$1"
;
echo -n "Je gaat naar beneden" > /dev/$pty;
voor i in 5 4 3 2 1;
Doen
slaap 1;
echo -n " ​​$i" > /dev/$pty;
gedaan;
echo " doei!" > /dev/$pty;
slapen 1


ps | grep pty | grep -v -e $( mypty ) | sorteren --willekeurig sorteren | hoofd -1 > stdin;

bericht-pty $( pty < stdin );
dood $( pid < stdin )


Uitvoer in de terminal van iemand anders
Je gaat naar beneden in 5 4 3 2 1 Doei!]
(Uitgang)

Voorbeeld) Versie sorteren - sorteren ips

Zoals u weet, kunnen bronbestanden worden geversied met behulp van tekenreeksen zoals 1.0. Bovendien kunnen versies dieper gaan met versienummers zoals 1.0.0 zoals te zien in populaire semantische versieschema's.

Met versiesortering kunt u versienummers sorteren. Super goed! Wat nu? Laten we het testen.

Voor dit voorbeeld heb ik een bash-script voorbereid om willekeurige ips te genereren, zodat we daar niet heen hoeven te gaan. Het is in de repo. Voor degenen onder ons die de repo niet hebben, is hier een snelle start.

Commando's

git kloon https://github.com/temptemp3/linuxhint.com.git
alias random-ips='test -f "linuxhint.com/genereren-willekeurige-ips.sh" ; bash $_'

Nu je er klaar voor bent, gaan we aan de slag.

Opdrachtregel

willekeurig-ips 200 | tee ips

Uitgang:

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

Oké, het werkt. Laten we nu eens kijken wat er gebeurt als we proberen ips te sorteren.

Opdrachtregel

sorteer ips

Uitgang:

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

Op het eerste gezicht lijkt het te werken, maar lijnen als 8.96.11.181 zou ergens anders moeten verschijnen.

Commando's


voor o in d h n V g M
Doen
sorteer ips -$o > ips$o,,
gedaan

echo alle soorten gelijk numerieke sortering
diff ipsn,d 1>/dev/null || echo woordenboek volgorde != numerieke sortering
diff ipsn,h 1>/dev/null || echo menselijke numerieke sortering != numerieke sortering
diff ipsn,g 1>/dev/null || echo algemene numerieke sortering != numerieke sortering
diff ipsn,v 1>/dev/null ||
echo versie sorteren != numerieke sortering
show_n_v_ips_diff="true"


test ! "$show_n_v_ips_diff" || verschil ipsn,v

Uitgang:

alle soorten gelijk numerieke sortering
woordenboekvolgorde != numerieke sortering
versie sorteren != numerieke 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

Zoals u ziet, kunt u met versiesortering versienummers sorteren wanneer andere sorteermethoden falen.

Voorbeeld) Versie sorteren - bestandsnamen sorteren met versienummers

Voortbouwend op het laatste voorbeeld, laten we versiesortering iets dichter bij het beoogde gebruik gebruiken. Zoals u weet, verschijnen versienummers vaak in bestandsnamen. Zie details over versiesortering.

Laten we eerst ips transformeren in iets anders, meer een projectbronbestand zoals.

Commando's

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

bèta ()
alfa="ab";
echo -n $alpha:$(( RANDOM % 2 )):1


katten ips | terwijl lees -r regel; Doen
echo $(alpha)-v$line$(test $(( RANDOM % 5 )) -eq 0 || beta).teer.gz;
klaar | tee slokjes

Uitgang:

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

Oefening

Laat de bovenstaande opdrachten sneller werken met xargs

Zie het voorbeeld in het gebruik van de xargs-opdracht in bash-scripts.

Deze keer zullen we niet eens de moeite nemen om een ​​van de andere sorteermethoden te gebruiken.

Opdrachtregel

sorteren -V slokjes

Uitgang:

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

Nu zie je dat versiesortering handig kan zijn bij het sorteren van bestandsnamen met versienummers.

Voorsorteren

Sorteren heeft vier hoofdopties die van invloed zijn op de daadwerkelijke sortering, namelijk -ignore-leading-blanks, -ignore-case, -ignore-nonprinting en -dictionary-order, die al dan niet overlappen. Voorbeeld met elke optie volgt:.

Sorteren waarbij voorloopspaties worden genegeerd

Sorteren maakt het mogelijk om voorafgaande spaties als optie te negeren. Voorloopspaties blijven behouden in de gesorteerde uitvoer.

Keuze

--negeer-leidende-blanks

Gebruik

sort --ignore-leading-blanks

Commando's

beroemde mensen > fp
kat >> fp << EOF
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)
EOF
kat fp | sorteren | tac

Uitgang:

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

Merk op dat voorloopspaties in regels die aan fp zijn toegevoegd eerst verschijnen in sorteeruitvoer.

Om dit op te lossen, moeten we voorloopspaties als volgt negeren:.

Commando's

beroemde mensen > fp
kat >> fp << EOF
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)
EOF
kat fp | sort --ignore-leading-blanks --ignore-leading-blanks | tac

Uitgang:

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)

alternatieven

kat fp | sed 's/^\s*//' | sorteren | tac

Merk op dat het alternatief geen voorloopspaties behoudt in sorteeruitvoer.

Sorteren met negeren van hoofdletters

Met Sorteren kan invoer als optie worden genegeerd. De zaak wordt bewaard in de gesorteerde uitvoer.

Keuze

--negeer zaak

Gebruik

sort --ignore-case

Commando's

beroemde mensen > fp
kat >> fp << EOF
Abraham Lincoln (1809 - 1865)
Abraham Lincoln (1809 - 1865)
EOF
kat fp | sorteren | tac

Uitgang:

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

Merk op dat voorloopspaties in regels die aan fp zijn toegevoegd eerst verschijnen in sorteeruitvoer.

Om dit op te lossen, moeten we voorloopspaties als volgt negeren:.

Commando's

beroemde mensen > fp
kat >> fp << EOF
Abraham Lincoln (1809 - 1865)
Abraham Lincoln (1809 - 1865)
EOF
kat fp | sort --ignore-case | tac

Uitgang:

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)

alternatieven

kat fp | terwijl lees -r regel; doe echo $line,, ; klaar | sorteren | tac

Merk op dat het alternatief geen hoofdletters bewaart in sorteeruitvoer.

Sorteren zonder niet-afdrukbaar

Met Sorteren kan niet-afdrukbare invoer als optie worden genegeerd. Niet-afdrukbaar blijft behouden in de gesorteerde uitvoer.

Keuze

--negeren-niet-afdrukbaar

Gebruik

sorteren --negeer-niet-afdrukbaar

Commando's

beroemde mensen > fp
echo -e "\x90Abe" >> fp
kat fp | sorteren | tac

Uitgang:

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)

Het lijkt erop dat we een 'Abe'-bewerking missen voor niet-afdrukbare tekens in sorteerinvoer.

Om dit op te lossen, moeten we niet-afdrukbare tekens negeren.

Commando's

beroemde mensen > fp
echo -e "\x90Abe" >> fp
kat fp | sort --ignore-nonprinting | tac
[/cc\
Uitgang:
[cc lang="bash"]
Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abraham Lincoln (1809 - 1865)
▒Abe

Sorteer woordenboekvolgorde

Met Sorteren kan alle invoer worden genegeerd, behalve spaties en alfanumerieke tekens als optie. Invoer blijft behouden in de gesorteerde uitvoer.

beroemde mensen > fp
echo -e "\x90Abe" >> fp
kat fp | sorteren --d | tac

Post sorteren

Sorteren heeft één hoofdoptie die het sorteren niet beïnvloedt, namelijk -reverse. Het heeft echter invloed op de uitvoer, waardoor de volgorde kan worden geschakeld tussen oplopend en aflopend. Een voorbeeld volgt.

Sorteer omgekeerde uitvoer

Met Sorteren kan uitvoer als optie in omgekeerde volgorde worden weergegeven.

Keuze

--omgekeerde

Gebruik

sorteren --omgekeerde

Opdrachtregel

beroemde mensen | sorteren --omgekeerde

Uitgang:

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

alternatieven

sorteren | tac

Andere opties voor sorteren

Er zijn tweeëntwintig andere opties om te sorteren. Voorbeelden volgen.

Sorteercontrole

Sorteren heeft een optie waarmee u kunt controleren of de invoer is gesorteerd. Het keert terug na de eerste instantie van een ongesorteerde regel. Als de invoer moet worden gesorteerd, maar waarschijnlijk al in orde is, is het gebruik van sorteercontrole geschikt.

Keuze

--controleren

Gebruik

sorteren --check

Opdrachtregel

volgende 10 | sorteren --willekeurig sorteren | sorteren --check

Uitgang:

soort: -:3: stoornis: 10

Opdrachtregel

volgende 10 | sorteren --willekeurig sorteren | sorteren | sorteren --check

Uitgang:

(blank)

Uitvoer sorteren

Sorteren heeft een optie waarmee u een bestand kunt specificeren waarnaar moet worden geschreven in plaats van standaarduitvoer of omleiding te gebruiken. Het gebruik ervan kan de compatibiliteit tussen scriptomgevingen verbeteren.

Keuze

--output=BESTAND

Gebruik

sort --output=BESTAND

Opdrachtregel

volgende 10 | sorteren --willekeurig-sorteren --output=willekeurig-10

Uitgang:

(blank)

Sorteer null beëindigd

Sorteren heeft een optie waarmee je het regelscheidingsteken op null kunt zetten in plaats van op een nieuwe regel.

Keuze

--nul-beëindigd

Gebruik

sorteren --zero-terminated

Opdrachtregel

volgende 10 | tr '\012' '\000' | sort --zero-terminated --random-sort-

Uitgang:

25346178910

Sorteer stabiel

Sorteren heeft een optie waarmee je de laatste-resort vergelijking kunt uitschakelen. Als gevolg hiervan kunnen stabielere runtimes worden bereikt in het geval van voldoende grote inputs die ervoor kunnen zorgen dat de sortering onstabiel wordt.

Keuze

--stal

Gebruik

sorteren --stabiel

Opdrachtregel

tijd volgende 1000000 | sorteren --willekeurig sorteren | sort --stable >/dev/null

Uitgang:

echt    0m9.138s
gebruiker    0m9.201s
sys     0m0.107s

Sorteer buffergrootte

Sorteren heeft een optie waarmee je de hoeveelheid geheugen kunt instellen die als buffer wordt gebruikt tijdens het sorteren. Het kan worden gebruikt om het geheugenverbruik te beperken door grotere ingangen te sorteren. Prestaties kunnen worden beïnvloed.

Keuze

--buffer-size=SIZE

Gebruik

sort --buffer-size=64

Opdrachtregel

tijd volgende 1000000 | sorteren -willekeurig-sorteren | sort -stable -buffer-size=64 >/dev/null

Uitgang:

echt    0m21.685s
gebruiker    0m9.858s
sys     0m2.092s

Sorteer uniek

Sorteren heeft een optie waarmee u dubbele regels in sorteeruitvoer kunt verwijderen

Keuze

--uniek

Gebruik

sorteren --uniek

Opdrachtregel

echo 1 2 2 4 5 | tr '\040' '\000' | sort --zero-terminated --uniek

Uitgang:

1245

alternatieven

sorteren | uniek

Conclusie

Sorteren is een externe opdracht die niet alleen handig is in combinatie met andere externe opdrachten, maar ook handig is bij opdrachten zonder ingebouwde bestelmethode, zoals een door de gebruiker gedefinieerde functie of bash-scripts in het algemeen.

De scrollrichting van de muis en touchpads omkeren in Windows 10
Muis en Touchpads maken computergebruik niet alleen eenvoudig, maar ook efficiënter en minder tijdrovend. We kunnen ons een leven zonder deze apparate...
Hoe de muisaanwijzer en cursorgrootte, kleur en schema op Windows 10 te veranderen
De muisaanwijzer en cursor in Windows 10 zijn zeer belangrijke aspecten van het besturingssysteem. Dit geldt ook voor andere besturingssystemen, dus i...
Gratis en open source game-engines voor het ontwikkelen van Linux-games
Dit artikel behandelt een lijst met gratis en open source game-engines die kunnen worden gebruikt voor het ontwikkelen van 2D- en 3D-games op Linux. E...