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
ENDbloku, 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