sort
Wie kann ich mit coreutils numerisch nach einem Hexadezimalwert (Feld) sortieren? Ich hatte etwas in der Art von erwartet
sort -k3,3x file_to_sort
einen solchen x
gibt es jedoch nicht.
Edit: Die beste Lösung, die ich bisher gefunden habe, ist:
{ echo ibase=16; cut -d' ' -f3 file_to_sort; } |
bc | paste -d: - file_to_sort | sort -t: -k1,1n | cut -d: -f2-
Wo das cut -d' ' -f3
Suchfeld isoliert (das ist -k3,3
- das kann natürlich variieren) und bc
in Dezimalzahlen konvertiert wird (erfordert hexadezimale Großbuchstaben ohne 0x
Präfix, die mit meiner Groß- / Kleinschreibung übereinstimmen). Dann füge ich Spalten zusammen, sortiere und teile sie.
-k3,3
? Sie haben Hex-Nuber, die mit 0x anstarren und alle die gleiche Länge haben? Keine Mischung aus Groß- / Kleinschreibung? Wenn ja, sollten sie richtig sortieren, wenn sie als Zeichenfolgen interpretiert werden. Vielleicht können Sie uns einige Beispieldaten zeigen?Antworten:
Eine Lösung in
perl
:Erläuterung
Während der Verarbeitung der Datei erstellen wir ein Array von Array
@h
, wobei jedes Element eine Arrayreferenz ist[$F[-1],$_]
, wobei das erste Element der zu vergleichende Hex-Wert und das zweite Element die gesamte Zeile ist.Im
END
Block verwenden wir die Schwartzsche Transformation :@h
Erstellen Sie mit jedem Element von ein anonymes Array, das die gesamte Zeile ($_->[1]
das zweite Element jedes Arrays ref in@h
) und den zu vergleichenden Hexadezimalwert enthälthex($_->[0])]
Sortieren Sie über der Array-Basis nach dem Hex-Wert
$a->[1] <=> $b->[1]
Holen Sie sich das erste Element jedes Arrays ref in sortiertes Array
map { $_->[0] }
und drucken Sie das Ergebnis.Aktualisieren
Mit @ Joseph R's Vorschlag, ohne Schwartzian Transform zu verwenden:
Update 2
Nachdem ich den Kommentar von Stefan gelesen habe, denke ich, dass dies heißen kann
direct
:quelle
print for sort { hex $a->[-1] <=> hex $b->[-1] } @h
:? Derhex
Betreiber ist kaum teuer genug, um einen Schwartz zu rechtfertigen, nicht wahr?Ich verwende diese Beispieldaten:
Die Idee ist, eine neue Version dieser Daten mit dem Sortierfeld in Dezimalform zu erstellen. Dh
awk
wandelt es, prepends es jede Zeile, wird das Ergebnis sortiert und als letzten Schritt wird das hinzugefügte Feld entfernt:Was zu dieser Ausgabe führt:
quelle
sort
?Eingang
Sortieren eines Liners
Schritt für Schritt sortieren
Schritt 1: Fügen Sie eine neue erste Spalte mit der dezimalen Darstellung der Hex-Zahl hinzu.
Schritt 2: Sortieren Sie die Zeilen numerisch im ersten Feld.
Schritt 3: Entfernen Sie die erste Spalte.
quelle
Angepasst von: http://www.unix.com/302548935-post6.html?s=b4b6b3ed50b6831717f6429113302ad6
: Zu sortierende Datei:
Befehl:
Ausgabe:
- wo der toupper ($ 0) Kleinbuchstaben "aufwertet", so dass sie zuerst sortiert werden (nicht sicher, ob das notwendig ist?)
quelle