Ich frage mich, wie ich das zugehörige Array in Bash sortieren soll. Ich habe das Handbuch ausprobiert, aber es scheint nichts mit Sortieren zu tun zu haben.
Die aktuelle Lösung besteht darin, alles wiederzugeben und ein externes Programm zu verwenden, d. H. key value | sort -k2
Das sieht für mich ineffizient aus.
Ein Beispiel für ein Array war:
A['192.168.2.2']=5
A['192.168.3.2']=1
A['192.168.1.1']=9
Und ich werde nach den Top 2 der verwendeten IP-Adressen suchen, nämlich 192.168.1.1 und 192.168.2.2, dh ich muss dieses Array nach seinem Wert sortieren.
bash
es einfach zu tun. Was versuchst du zu machen?Antworten:
Zsh verfügt über eine integrierte Methode zum Sortieren von Listen. Ich glaube jedoch nicht, dass es eine Möglichkeit gibt, die Werte zu sortieren, während die Korrelation mit den Schlüsseln mithilfe von Parametererweiterungs- und Indexflags beibehalten wird , was bedeutet, dass eine explizite Schleife erforderlich ist. Angenommen, Ihre Werte enthalten kein Nullzeichen, können Sie ein Array erstellen, das die Werte und Schlüssel enthält, die mit einem Nullzeichen dazwischen verknüpft sind, und dieses sortieren.
EDIT by @sch: Die ersten 4 Zeilen können vereinfacht werden
Die Variablen
keys
undvalues
enthalten die Schlüssel und Werte vonA
in einer beliebigen, aber konsistenten Reihenfolge. Sie können schreiben,keys=(${(k)A})
wenn keine leeren Schlüssel vorhanden sind, und dies gilt auch für Werte.keys_sorted_by_decreasing_value
sortiert Schlüssel lexikographisch, fügt dasn
Flag hinzu, um numerisch (9
vorher10
) zu sortieren, und entfernt es,O
wenn Sie in aufsteigender Reihenfolge sortieren möchten (in diesem Fall können die beiden obersten Werte mit dem Index erhalten werden[-2,-1]
).Ksh93 bietet die Möglichkeit, nur die Positionsparameter mit zu sortieren
set -s
. Dies existiert auch in zsh, aber nicht in bash 4.2. Angenommen, Ihre Werte enthalten keine Zeilenumbrüche oder Steuerzeichen, die vor Zeilenumbrüchen sortiert werden:Das ist alles ziemlich komplex, also können Sie sich auch für die externe Sortierung entscheiden, die viel einfacher zu schreiben ist. Angenommen, weder Schlüssel noch Werte enthalten Steuerzeichen in ksh oder bash:
quelle
Eine Shell ist vor allem ein Werkzeug, um andere Werkzeuge auszuführen. Es klingt für mich nach einer Programmiersprache wie Perl, Ruby, Python ...
Trotzdem gibt es hier eine mögliche Lösung für zsh.
In zsh können Sie eine sortierte Liste der Schlüssel eines zugeordneten Arrays (
${(kOn)A}
) oder der Werte (${(On)A}
) abrufen, jedoch nicht direkt eine Liste der Schlüssel aus der sortierten Werteliste (AFAIK). Sie können jedoch Folgendes tun:Das heißt, ordne (
O
) die Liste der Werte ($A
) numerisch (n
) undfor
jeden Wertv
, addiere diek
Ey /v
Alue-Paare, die mit dem Wert übereinstimmen$v
(e
für eine genaue Übereinstimmung,R
um die umgekehrte Liste basierend auf dem Wert und nicht dem Schlüssel zu erhalten) und füge diese dem hinzuB
assoziatives Array.Dann erhalten Sie die sortierte Liste in
B
:Und Sie können die ersten 2 Tasten mit auswählen
quelle
Der beste Weg, ein assoziatives Bash-Array nach KEY zu sortieren, besteht darin, es NICHT zu sortieren.
Rufen Sie stattdessen die Liste der SCHLÜSSEL ab, sortieren Sie diese Liste als Variable und durchlaufen Sie die Liste. Beispiel: Angenommen, Sie haben ein Array von IP-Adressen (Schlüsseln) und Hostnamen (Werten):
Alternative: Erstellen Sie eine neue Liste aus KEYs, konvertieren Sie sie in Zeilen, sortieren Sie sie, konvertieren Sie sie zurück in eine Liste und verwenden Sie sie, um das Array zu durchlaufen.
quelle
"Assoziatives Array" bedeutet häufig, dass die Daten im Array eine reale Bedeutung haben, was in Ihrem Fall der Fall ist. Die externe Unix-Sortierung ist ideal für diese Aufgabe, und nur wenige C-Programmierer können die Unix-Sortierung übertreffen. Speziell für Big Data können Sie Unix und Shell anpassen, in Scheiben schneiden, teilen und die volle Leistung von Unix und Shell erzielen. Aus diesem Grund kümmern sich so viele Shell- und Awk-Plattformen dort nicht um eine Sorte.
quelle