Verwendung von coreutils sort , wie kann ich numerisch nach einem Hexadezimalwert (Feld) sortieren? Ich hatte etwas in der Art von
sort -k3,3x file_to_sort
jedoch so ein x existiert nicht.
Bearbeiten: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 der cut -d' ' -f3 isoliert das Suchfeld (dies ist -k3,3 — das kann natürlich variieren) und bc konvertiert in dezimal (erfordert Großbuchstaben hex, ohne 0x Präfix, passend zu meinem Fall). Dann verbinde, sortiere und teile ich Spalten.
Minimale Beispieleingabe:
5 hhf 25
3 ezh ae
1 hdh d12
2 ukr 9f
4 jjk 7
Erwartete Ausgabe (Datei sortiert nach hex dritte Spalte):
4 jjk 7
5 hhf 25
2 ukr 9f
3 ezh ae
1 hdh d12
Akzeptierte Antwort:
Eine Lösung in perl :
$ perl -anle '
push @h, [$F[-1],$_];
END {
print for map { $_->[0] }
sort { $a->[1] <=> $b->[1] }
map { [$_->[1],hex($_->[0])] } @h;
}
' file
4 jjk 7
5 hhf 25
2 ukr 9f
3 ezh ae
1 hdh d12
Erklärung
-
Während der Verarbeitung der Datei erstellen wir ein Array des Arrays
@h, jedes seiner Elemente ist eine Array-Referenz[$F[-1],$_], wobei das erste Element der zu vergleichende Hex-Wert ist und das zweite Element die gesamte Zeile. -
In
ENDBlock verwenden wir die Schwartzsche Transformation:-
Mit jedem Element von
@h, erstellt ein anonymes Array, enthält die ganze Zeile ($_->[1]das zweite Element jeder Array-Referenz in@h) und den Hex-Wert zum Vergleichhex($_->[0])] -
Sortieren Sie das obige Array basierend auf dem Hex-Wert
$a->[1] <=> $b->[1] -
Holen Sie sich das erste Element jeder Array-Referenz im sortierten Array
map { $_->[0] }Drucken Sie dann das Ergebnis aus.
-
Aktualisieren
Mit dem Vorschlag von @Joseph R, ohne die Schwartzsche Transformation zu verwenden:
$ perl -anle '
push @h, [hex($F[-1]),$_];
END {
print $_->[1] for
sort { $a->[0] <=> $b->[0] } @h;
}
' file
Aktualisierung 2
Nachdem ich Stefans Kommentar gelesen habe, denke ich, dass dies direct aufrufen kann :
$ perl -e '
print sort {hex((split(/s+/,$a))[-1]) <=> hex((split(/s+/,$b))[-1])} <>;
' file
4 jjk 7
5 hhf 25
2 ukr 9f
3 ezh ae
1 hdh d12