GNU/Linux >> Znalost Linux >  >> Linux

Seřadit podle hexadecimální hodnoty?

Pomocí coreutils sort , jak mohu číselně seřadit podle hexadecimální hodnoty (pole)? Čekal jsem něco ve smyslu

sort -k3,3x file_to_sort

nicméně takový x neexistuje.

Edit:Nejlepší řešení, se kterým jsem zatím přišel, je:

{ echo ibase=16; cut -d' ' -f3 file_to_sort; } |
  bc | paste -d: - file_to_sort | sort -t: -k1,1n | cut -d: -f2-

kde cut -d' ' -f3 izoluje vyhledávací pole (toto je -k3,3 — to se může samozřejmě lišit) a bc provádí převod na desítkové (vyžaduje velká hexadecimální písmena, bez 0x prefix, odpovídající mému případu). Poté sloupce spojím, seřadím a rozdělím.

Minimální vstup vzorku:

5 hhf 25
3 ezh ae
1 hdh d12
2 ukr 9f
4 jjk 7

Očekávaný výstup (soubor seřazený podle hex třetí sloupec):

4 jjk 7
5 hhf 25
2 ukr 9f
3 ezh ae
1 hdh d12

Přijatá odpověď:

Řešení v 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

Vysvětlení

  • Při zpracování souboru vytvoříme pole pole @h , každý jeho prvek je odkazem na pole [$F[-1],$_] , přičemž první prvek je hexadecimální hodnota k porovnání a druhý prvek je celý řádek.

  • V END bloku, použijeme Schwartzovu transformaci:

    • S každým prvkem @h , vytvořte anonymní pole, obsahuje celý řádek ( $_->[1] druhý prvek každého pole ref v @h ) a hexadecimální hodnotu pro porovnání hex($_->[0])]

    • Seřadit výše pole podle hexadecimální hodnoty $a->[1] <=> $b->[1]

    • Získejte první prvek každého ref pole v seřazeném poli map { $_->[0] } pak vytiskněte výsledek.

Aktualizovat

S návrhem @Joseph R, bez použití Schwartzovské transformace:

$ perl -anle '
    push @h, [hex($F[-1]),$_];
    END {
        print $_->[1] for
            sort { $a->[0] <=> $b->[0] } @h;
    }
' file

Aktualizace 2

Po přečtení stefanova komentáře si myslím, že to může být direct :

$ 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. Maximální hodnota ID procesu?

  2. Seřadit výstup podle sloupce?

  3. sort Příklady příkazů v Linuxu

  1. sort:příkaz nenalezen

  2. Maximální PID v Linuxu

  3. Zabránění přetečení celého čísla C

  1. Jak seřadit výstup Du podle velikosti?

  2. Najít největší soubory nebo adresáře?

  3. GNU řazení podle velikosti písmen