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