Usando coreutils sort
, ¿cómo puedo ordenar numéricamente por un valor hexadecimal (campo)? Esperaba algo como
sort -k3,3x file_to_sort
sin embargo, tal x
no existe.
Editar:la mejor solución que se me ocurrió hasta ahora es:
{ echo ibase=16; cut -d' ' -f3 file_to_sort; } |
bc | paste -d: - file_to_sort | sort -t: -k1,1n | cut -d: -f2-
donde el cut -d' ' -f3
aísla el campo de búsqueda (esto es -k3,3
— esto puede variar, por supuesto), y bc
hace la conversión a decimal (requiere hexadecimal en mayúsculas, sin 0x
prefijo, coincidiendo con mi caso). Luego uno, clasifico y divido columnas.
Entrada de muestra mínima:
5 hhf 25
3 ezh ae
1 hdh d12
2 ukr 9f
4 jjk 7
Salida esperada (archivo ordenado por hex
tercera columna):
4 jjk 7
5 hhf 25
2 ukr 9f
3 ezh ae
1 hdh d12
Respuesta aceptada:
Una solución en 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
Explicación
-
Mientras procesamos el archivo, creamos una matriz de matriz
@h
, cada uno de sus elementos es una referencia de matriz[$F[-1],$_]
, con el primer elemento es el valor hexadecimal a comparar, y el segundo elemento es la línea completa. -
En
END
block, usamos la transformada de Schwartzian:-
Con cada elemento de
@h
, crea una matriz anónima, contiene la línea completa ($_->[1]
el segundo elemento de cada referencia de matriz en@h
) y el valor hexadecimal para compararhex($_->[0])]
-
Ordene la base de la matriz anterior en el valor hexadecimal
$a->[1] <=> $b->[1]
-
Obtenga el primer elemento de cada referencia de matriz en la matriz ordenada
map { $_->[0] }
luego imprima el resultado.
-
Actualizar
Con la sugerencia de @Joseph R, sin usar Schwartzian Transform:
$ perl -anle '
push @h, [hex($F[-1]),$_];
END {
print $_->[1] for
sort { $a->[0] <=> $b->[0] } @h;
}
' file
Actualización 2
Después de leer el comentario de Stefan, creo que esto puede llamar 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