Linux-Befehle

Bash-Sortierungsbefehl

Bash-Sortierungsbefehl
Viel Glück beim Versuch, einen Sortieralgorithmus in bash zu implementieren, als er vor morgen fertig ist. Keine Sorge, das müssen Sie nicht, da Sie den Sortierbefehl haben.

Mit sort können Sie Dateien basierend auf der Reihenfolge im Wörterbuch oder nach numerischen Werten sortieren, Dateizeilen randomisieren, doppelte Zeilen entfernen und prüfen, ob eine Datei sortiert ist.

Sie können vielleicht andere Dinge damit machen, aber zuerst wollen wir uns darum kümmern, wie man sort in Bash-Skripten verwendet.

Was ist sortiert?

Sortieren ist ein externer Befehl, der Dateien verkettet, während deren Inhalt nach einem Sortiertyp sortiert wird, und die Sortierergebnisse in die Standardausgabe schreibt.

Befehlsoptionen für bash sortieren

Der Sortierbefehl enthält 31 Optionen (13 Haupt- und 18 als andere kategorisiert). Die meisten erfahrenen Bash-Programmierer (sogar Experten) kennen nur wenige Hauptsortieroptionen, die erforderlich sind, um zurechtzukommen. Andere werden selten berührt. Zum Glück haben wir Zeit, sie alle anzufassen.

Hauptsortieroptionen

Dies sind die Optionen, die Ihnen helfen, Dinge zu erledigen und zu sortieren (Sortieren), sowie sortierte Ergebnisse zu manipulieren (Nachbearbeitung) und Filter anzuwenden (Filter) vor dem Sortieren.

Sortierung

Sort kommt mit 5 verschiedenen Sortierarten. Hier ist eine Tabelle, die jeden Sortiertyp mit den zugehörigen Optionen zeigt.

Sortieren Kurze Option / Lange Option / etc
Wort
Numerische Sortierung (allgemein) -g / -general-numeric-sort
allgemein-numerisch
Unterstützung für wissenschaftliche Notation
0.1234e4 = 1234
Numerische Sortierung (Mensch) -h / -human-numeric-sort
menschlich-numerisch
1.234K = 1234
Numerisch -n / -numerisch-sortieren
numerisch
… < -1 < 0 < 1 <…
Monat -M / -Monatssortierung
Monat
Unbekannt < Jan < Feb <… < Nov < Dec
Zufällig -r / -zufällige Sortierung
zufällig
Ausführung -V / -version-sortieren
Ausführung

Beachten Sie, dass jeder Sortiertyp eine lange Option hat, die mit -sort endet. Zusätzlich zu bestimmten Sortieroptionen kann die Option -sort=WORD verwendet werden, um nach Wörtern zu sortieren. Zum Beispiel kann -sort=random anstelle von -random-sort oder -r . verwendet werden.

Beispiele

Hier sind einige Beispiele für Sortierbefehle für jede Sortiermethode.

Beispiel) Namen sortieren

Sortieren hat keine Probleme, Zeilen alphabetisch zu sortieren. Betrachten Sie eine Liste berühmter Personen, die nicht sortiert sind.

Funktion

berühmte Menschen()

curl --still https://www.biografieonline.Netto/Menschen/berühmt-100.html
| grep-Beitragsinhalt | sed -e 's/<[^>]*.//g' -e 's/WWII//g' -e 's/\(Wilbur\)
/\1 Wright/'| grep -o -e '\(\([A-Z]\+[.]\?\)\+[a-z]*\s\)\+([0-9]\+\s[^)]\+.'

Befehlszeile

berühmte-leute | Sortieren

Ausgabe

Stephen King (1947 - )
Steve Jobs (1955 - 2012)
Stachel (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)

Beispiel) Allgemeine numerische Sortierung

Wenn wir numerische Werte unter wissenschaftlicher Notation wie 99e2 sortieren müssen, können wir die allgemeine numerische Sortierung verwenden.

Funktion

unsortierte-numerische-Werte ()

Sequenz 100 | sort --random-sort | sed '3i 9e2' | sed '3i 99K'

Betrachten Sie die sortierte Ausgabe mit jeder Methode. Beachten Sie, dass die Liste neben den Werten 1 bis 100 auch '9e12' (900) und '99K' (99000) enthält.

Befehlszeile

unsortierte-numerische-Werte | sortieren -n

Ausgabe

96
97
98
99
99K
100

Was ist mit 900 und 99000. Das ist richtig, es ist nur eine numerische Sortierung. Nächster.

Befehlszeile

unsortierte-numerische-Werte | sortieren -h

Ausgabe

96
97
98
99
100
99K

Was ist mit 900. Das ist richtig, es ist nur eine menschliche numerische Sortierung. Nächster.

Befehlszeile

unsortierte-numerische-Werte | sortieren -g

Ausgabe

96
97
98
99
99K
100
9e2

Was ist mit 99000. Das ist richtig, es ist nur eine allgemeine numerische Sortierung. Wie Sie sehen, ist in diesem Fall keine Sortiermethode kompatibel; Das bedeutet jedoch nicht, dass Sie keine Lösung finden können.

Befehlszeile

unsortierte-numerische-Werte | sed 's/[kK]/e3/' | sortieren -g

Ausgabe

96
97
98
99
100
9e2
99e3

Das ist jetzt eher so.

Beispiel) Menschliche numerische Sortierung

Wenn wir numerische Werte unter Berücksichtigung der Bedeutung von Notationen wie K, G, M und E sortieren müssen, können wir die menschliche numerische Sortierung verwenden.

Befehlszeile

Sequenz 100 | sort --random-sort | sed '3i 3k' | sortieren -h

Ausgabe

96
97
98
99
100
3k

Beispiel) Numerische Sortierung

Wenn wir nur ganze Zahlen sortieren müssen, reicht die numerische Sortierung aus.

Befehlszeile

Sequenz 100 | sort --random-sort | sort --numerics-sort

Ausgabe

95
96
97
98
99
100

Beispiel) Monatssortierung

Mit der Monatssortierung können Sie Zeilen nach Monat sortieren. Es könnte sich als nützlich erweisen, Zeilen nach Monaten zu gruppieren, insbesondere wenn die Option zum Sortieren nach Zeit nicht verfügbar ist.

Funktion

Monate ()

Katze  <Jan
Februar
Beschädigen
April
Kann
Juni
Juli
August
September
Okt
November
Dezember
EOF

Angenommen, die Monate sind nicht sortiert.

Befehlszeile

Monate | sort --random-sort

Ausgabe

Beschädigen
Okt
Dezember
April
Kann
September
August
November
Juli
Jan
Februar
Juni

Wir können immer nach Monat sortieren.

Befehlszeile

Monate | sort --random-sort | sort --Monatssortierung

Ausgabe

Jan
Februar
Beschädigen
April
Kann
Juni
Juli
August
September
Okt
November
Dezember

Beachten Sie, dass, wenn wir Dec im November in einen beliebigen Teilstring ändern, sagen wir 'Novem', dieser nach 'Nov' in der sortierten Ausgabe erscheint.

Beispiel) Zufällige Sortierung – töte das Terminal eines anderen

Wie erwartet bewirkt die zufällige Sortierung das Gegenteil der Sortierung, sie verwechselt Zeilen.

Angenommen, wir wollen zu Bildungszwecken einen anderen Benutzer töten. Wir müssten sicherstellen, dass es nicht unser Pty ist, und die Angebote randomisieren, damit es schöner ist und wir sagen können, dass Ptys zufällig ausgewählt wurden.

Befehle

nachricht-pty ()


lokale Pty;
pty="$1"
;
echo -n "Du gehst runter" > /dev/$pty;
für i in 5 4 3 2 1;
tun
Schlaf 1;
echo -n " ​​$i" > /dev/$pty;
getan;
echo " Tschüss!" > /dev/$pty;
Schlaf 1


ps | grep pty | grep -v -e $( mypty ) | sort --random-sort | Kopf -1 > Standard;

Nachricht-pty $( pty < stdin );
töten $( pid < stdin )


Ausgabe im Terminal einer anderen Person
Du gehst in 5 4 3 2 1 Tschüss unter!]
(Ausfahrt)

Beispiel) Version sortieren - ips sortieren

Wie Sie wissen, können Quelldateien mit Zeichenfolgen wie 1 . versioniert werden.0. Darüber hinaus können Versionen mit Versionsnummern wie 1 . tiefer gehen.0.0, wie sie in gängigen semantischen Versionsschemata zu sehen ist.

Versionssortierung ermöglicht das Sortieren von Versionsnummern. Groß! Was jetzt? Lass es uns testen.

Für dieses Beispiel habe ich ein Bash-Skript vorbereitet, um zufällige IPs zu generieren, damit wir nicht dorthin gehen müssen. Es ist im Repository. Für diejenigen von uns, die das Repo nicht haben, ist hier ein Schnellstart.

Befehle

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

Jetzt, wo du bereit bist, lass uns loslegen.

Befehlszeile

random-ips 200 | Tee ips

Ausgabe

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

Okay, es funktioniert. Mal sehen, was passiert, wenn wir versuchen, ips zu sortieren.

Befehlszeile

ips sortieren

Ausgabe

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

Auf den ersten Blick scheint es zu funktionieren, aber Linien wie 8.96.11.181 sollte woanders erscheinen.

Befehle


für o in d h n V g M
tun
ips sortieren -$o > ips$o,,
getan

echo  alle Arten gleich numerisch sortieren
diff ipsn,d 1>/dev/null || Echo-Wörterbuchreihenfolge != numerische Sortierung
diff ipsn,h 1>/dev/null || Echo menschliche numerische Sortierung != numerische Sortierung
diff ipsn,g 1>/dev/null || Echo allgemeine numerische Sortierung != numerische Sortierung
diff ipsn,v 1>/dev/null ||
Echo-Version sortieren != numerische Sortierung
show_n_v_ips_diff="wahr"


Prüfung ! "$show_n_v_ips_diff" || Diff-IPsn,v

Ausgabe

alle Sorten gleich numerische Sortierung
Wörterbuchbestellung != numerische Sortierung
Version sortieren != numerische Sortierung
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

Wie Sie sehen, können Sie Versionsnummern sortieren, wenn andere Sortiermethoden fehlschlagen.

Beispiel) Version sortieren - Sortieren von Dateinamen mit Versionsnummern

Aufbauend auf dem letzten Beispiel verwenden wir version sort etwas näher an der beabsichtigten Verwendung. Wie Sie wissen, erscheinen Versionsnummern häufig in Dateinamen. Siehe Details zur Versionssortierung.

Lassen Sie uns zunächst ips in eine andere Projektquelldatei wie umwandeln.

Befehle

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

Beta ()
alpha="ab";
echo -n $alpha:$(( ZUFALL % 2 )):1


Katzen-IPs | while read -r Zeile; tun
echo $(alpha)-v$line$(test $(( RANDOM % 5 )) -eq 0 || beta).Teer.gz;
fertig | Tee Schlucke

Ausgabe

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

Übung

Machen Sie die obigen Befehle mit xargs schneller

Siehe Beispiel zur Verwendung des xargs-Befehls in Bash-Skripten.

Diesmal werden wir uns nicht einmal die Mühe machen, eine der anderen Sortiermethoden zu verwenden.

Befehlszeile

sortieren -V Schlucke

Ausgabe

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

Jetzt sehen Sie, dass die Versionssortierung beim Sortieren von Dateinamen mit Versionsnummern nützlich sein kann.

Vorsortieren

Sortieren hat vier Hauptoptionen, die sich auf die tatsächliche Sortierung auswirken, nämlich -führende Leerzeichen ignorieren, -Groß-/Kleinschreibung ignorieren, -Nichtdrucken ignorieren und -Wörterbuchreihenfolge, die sich überschneiden können oder nicht. Beispiel mit jeder Option folgen.

Sortieren, führende Leerzeichen ignorieren

Mit Sortieren können führende Leerzeichen bei der Eingabe als Option ignoriert werden. Führende Leerzeichen bleiben in der sortierten Ausgabe erhalten.

Möglichkeit

--ignoriere-führende-Leerzeichen

Verwendung

sortieren --ignore-leading-blanks

Befehle

berühmte-leute > fp
Katze >> fp << EOF
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)
EOF
Katze fp | sortieren | tac

Ausgabe

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

Beachten Sie, dass führende Leerzeichen in Zeilen, die zu fp hinzugefügt wurden, zuerst in der Sortierausgabe erscheinen.

Um dies zu beheben, müssen wir führende Leerzeichen wie folgt ignorieren.

Befehle

berühmte-leute > fp
Katze >> fp << EOF
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)
EOF
Katze fp | sortieren --ignore-leading-blanks --ignore-leading-blanks | tac

Ausgabe

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)

Alternativen

Katze fp | sed 's/^\s*//' | sortieren | tac

Beachten Sie, dass die Alternative führende Leerzeichen in der Sortierausgabe nicht beibehält.

Sortieren, Groß-/Kleinschreibung ignorieren

Durch Sortieren kann die Groß-/Kleinschreibung optional ignoriert werden. Der Fall bleibt in der sortierten Ausgabe erhalten.

Möglichkeit

--Fall ignorieren

Verwendung

sortieren --ignore-case

Befehle

berühmte-leute > fp
Katze >> fp << EOF
Abraham Lincoln (1809 - 1865)
Abraham Lincoln (1809 - 1865)
EOF
Katze fp | sortieren | tac

Ausgabe

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

Beachten Sie, dass führende Leerzeichen in Zeilen, die zu fp hinzugefügt wurden, zuerst in der Sortierausgabe erscheinen.

Um dies zu beheben, müssen wir führende Leerzeichen wie folgt ignorieren.

Befehle

berühmte-leute > fp
Katze >> fp << EOF
Abraham Lincoln (1809 - 1865)
Abraham Lincoln (1809 - 1865)
EOF
Katze fp | sortieren --ignore-case | tac

Ausgabe

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)

Alternativen

Katze fp | while read -r Zeile ; echo $line,, ; fertig | sortieren | tac

Beachten Sie, dass die Alternative die Groß-/Kleinschreibung in der Sortierausgabe nicht beibehält.

Nicht druckbare Sortierung ignorieren

Sortieren ermöglicht, dass Eingaben, die nicht gedruckt werden, als Option ignoriert werden as. Nichtdrucken wird in der sortierten Ausgabe beibehalten.

Möglichkeit

--ignorieren-nicht drucken

Verwendung

sort --ignore-nonprinting

Befehle

berühmte-leute > fp
echo -e "\x90Abe" >> fp
Katze fp | sortieren | tac

Ausgabe

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)

Anscheinend fehlt ein 'Abe' für nicht druckbare Zeichen in der Sortiereingabe.

Um dies zu beheben, müssen wir nicht druckbare Zeichen ignorieren.

Befehle

berühmte-leute > fp
echo -e "\x90Abe" >> fp
Katze fp | sort --ignore-nonprinting | tac
[/cc\
Ausgabe
[cc lang="bash"]
Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abraham Lincoln (1809 - 1865)
Abe

Wörterbuchreihenfolge sortieren

Mit Sortieren können alle Eingaben außer Leerzeichen und alphanumerischen Zeichen als Option ignoriert werden. Eingaben bleiben in der sortierten Ausgabe erhalten.

berühmte-leute > fp
echo -e "\x90Abe" >> fp
Katze fp | sortieren --d | tac

Post sortieren

Sortieren hat eine Hauptoption, die sich nicht auf die Sortierung auswirkt, nämlich -reverse. Es wirkt sich jedoch auf die Ausgabe aus, sodass die Reihenfolge zwischen aufsteigend und absteigend umgeschaltet werden kann. Es folgt ein Beispiel.

Umgekehrte Ausgabe sortieren

Mit Sortieren kann die Ausgabe optional in umgekehrter Reihenfolge angezeigt werden.

Möglichkeit

--umkehren

Verwendung

sortieren – umkehren

Befehlszeile

berühmte-leute | sortieren – umkehren

Ausgabe

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

Alternativen

sortieren | tac

Andere Sortieroptionen

Es gibt zweiundzwanzig andere Optionen für die Sortierung. Beispiele folgen.

Scheck sortieren

Sortieren hat eine Option, mit der Sie überprüfen können, ob die Eingabe sortiert ist. Es kehrt nach der ersten Instanz einer unsortierten Zeile zurück. Für den Fall, dass die Eingabe sortiert werden muss, aber wahrscheinlich bereits in Ordnung ist, ist die Verwendung der Sortierprüfung geeignet.

Möglichkeit

--prüfen

Verwendung

sortieren --check

Befehlszeile

seq 10 | sort --random-sort | sortieren --check

Ausgabe

sortieren: -:3: Unordnung: 10

Befehlszeile

seq 10 | sort --random-sort | sortieren | sortieren --check

Ausgabe

(leer)

Ausgabe sortieren

Sortieren hat eine Option, mit der Sie eine Datei angeben können, in die geschrieben werden soll, anstatt die Standardausgabe oder Umleitung zu verwenden. Seine Verwendung kann die Kompatibilität zwischen Skriptumgebungen verbessern.

Möglichkeit

--Ausgabe=DATEI

Verwendung

sort --output=DATEI

Befehlszeile

seq 10 | sort --random-sort --output=random-10

Ausgabe

(leer)

Sortieren null beendet

Sortieren hat eine Option, mit der Sie das Zeilentrennzeichen auf Null anstelle eines Zeilenumbruchs setzen können.

Möglichkeit

--nullterminiert

Verwendung

sort --null-terminiert

Befehlszeile

seq 10 | tr '\012' '\000' | sort --null-terminiert --random-sort

Ausgabe

25346178910

Stabil sortieren

Sortieren hat eine Option, mit der Sie den Vergleich der letzten Instanz deaktivieren können. Dadurch können bei ausreichend großen Eingaben stabilere Laufzeiten erreicht werden, die dazu führen können, dass sort instabil läuft.

Möglichkeit

--stabil

Verwendung

sortieren --stable

Befehlszeile

Zeitseq 1000000 | sort --random-sort | sort --stable >/dev/null

Ausgabe

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

Puffergröße sortieren

Sortieren hat eine Option, mit der Sie die Menge an Speicher festlegen können, die beim Sortieren als Puffer verwendet wird. Es kann verwendet werden, um den Speicherverbrauch beim Sortieren größerer Eingaben zu begrenzen. Leistung kann beeinträchtigt sein.

Möglichkeit

--Puffergröße=GRÖSSE

Verwendung

sortieren --buffer-size=64

Befehlszeile

Zeitseq 1000000 | sortieren -zufällig-sortieren | sort -stable -buffer-size=64 >/dev/null

Ausgabe

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

Einzigartig sortieren

Sortieren hat eine Option, mit der Sie doppelte Zeilen in der Sortierausgabe entfernen können

Möglichkeit

--einzigartig

Verwendung

sortieren --einzigartig

Befehlszeile

Echo 1 2 2 4 5 | tr '\040' '\000' | sort --null-terminiert --unique

Ausgabe

1245

Alternativen

sortieren | einzigartig

Fazit

Sort ist ein externer Befehl, der nicht nur in Kombination mit anderen externen Befehlen nützlich ist, sondern auch praktisch, wenn er mit Befehlen ohne integrierte Sortiermethode verwendet wird, wie z. B. einer benutzerdefinierten Funktion oder Bash-Skripten im Allgemeinen.

Mit WinMouse können Sie die Mauszeigerbewegung auf einem Windows-PC anpassen und verbessern improve
Wenn Sie die Standardfunktionen Ihres Mauszeigers verbessern möchten, verwenden Sie Freeware WinMouse. Es fügt weitere Funktionen hinzu, damit Sie das...
Linker Mausklick funktioniert nicht unter Windows 10
Wenn Sie eine dedizierte Maus mit Ihrem Laptop oder Desktop-Computer verwenden, aber die linker Mausklick funktioniert nicht unter Windows 10/8/7 aus ...
Cursor springt oder bewegt sich zufällig während der Eingabe in Windows 10
Wenn Sie feststellen, dass Ihr Mauszeiger während der Eingabe auf einem Windows-Laptop oder -Computer automatisch und zufällig springt oder sich von s...