GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Nach Hex-Wert sortieren?

Verwendung von coreutils sort , wie kann ich numerisch nach einem Hexadezimalwert (Feld) sortieren? Ich hatte etwas in der Art von

erwartet
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 Vergleich hex($_->[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

Linux
  1. Wie sortiere ich die Ausgabe nach Größe?

  2. Teil einer Datei sortieren?

  3. Ausgabe nach Spalte sortieren?

  4. sort-Befehlsbeispiele in Linux

  5. Runden Sie eine geteilte Zahl in Bash

Linux-Sortierungsbefehl mit Beispielen

Sortieren:Befehl nicht gefunden

Sortieren einer tabulatorgetrennten Datei

Prozentwert mit GNU Diff

Maximale PID unter Linux

GNU-Sortierung nach Groß- und Kleinschreibung