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
END
Block 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