Uma solução em 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
Explicação
-
Durante o processamento do arquivo, criamos uma matriz da matriz
@h
, cada elemento é uma referência da matriz[$F[-1],$_]
, com o primeiro elemento é o valor hexadecimal a ser comparado e o segundo elemento é toda a linha . -
No bloco
END
, usamos Transformação de Schwartzian :-
Com cada elemento de
@h
, crie uma matriz anônima, contém a linha inteira ($_->[1]
o segundo elemento de cada matriz ref em@h
) e o valor hexadecimal para compararhex($_->[0])]
-
Classifique acima da base da matriz no valor hexadecimal
$a->[1] <=> $b->[1]
-
Pegue o primeiro elemento de cada matriz ref na matriz classificada
map { $_->[0] }
e imprima o resultado.
-
Atualizar
Com a sugestão de @Joseph R, sem usar o Schwartzian Transform:
$ perl -anle '
push @h, [hex($F[-1]),$_];
END {
print $_->[1] for
sort { $a->[0] <=> $b->[0] } @h;
}
' file
Atualização 2
Depois de ler o comentário do stefan, acho que isso pode chamar 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