Usando coreutils sort
, ¿cómo puedo ordenar numéricamente por un valor hexadecimal (campo)? Estaba esperando algo en la línea de
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 cut -d' ' -f3
aísla el campo de búsqueda (esto es -k3,3
, esto puede variar, por supuesto), y bc
realiza la conversión a decimal (requiere mayúscula hexadecimal, sin 0x
prefijo, que coincida con mi caso). Luego unir, ordenar y dividir columnas.
-k3,3
? ¿Tienes nubers hexagonales mirando con 0x y todos de la misma longitud? No hay mezcla de mayúsculas / minúsculas? En caso afirmativo, deben ordenar correctamente cuando se interpretan como cadenas. ¿Quizás pueda mostrarnos algunos datos de ejemplo?Respuestas:
Una solución en
perl
: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 para comparar, y el segundo elemento es la línea completa.En
END
bloque, usamos la transformación de Schwartz :Con cada elemento de
@h
, crear una matriz anónima, contiene la línea completa ($_->[1]
el segundo elemento de cada referencia de matriz@h
) y el valor hexadecimal para compararhex($_->[0])]
Ordenar por encima de la base de la matriz en el valor hexadecimal
$a->[1] <=> $b->[1]
Obtenga el primer elemento de cada referencia de matriz en una matriz ordenada y
map { $_->[0] }
luego imprima el resultado.Actualizar
Con la sugerencia de @Joseph R, sin usar la Transformación Schwartzian:
Actualización 2
Después de leer el comentario de stefan, creo que esto puede llamar
direct
:fuente
print for sort { hex $a->[-1] <=> hex $b->[-1] } @h
:? Elhex
operador no es lo suficientemente caro como para justificar un Schwartzian, ¿no?Yo uso este ejemplo de datos:
La idea es crear una nueva versión de estos datos con el campo de clasificación en forma decimal. Es decir, lo
awk
convierte, lo antepone a cada línea, el resultado se ordena y, como último paso, se elimina el campo agregado:Lo que da como resultado esta salida:
fuente
sort
?Entrada
Ordenar un revestimiento
Ordenar paso a paso
Paso 1: agregue una nueva primera columna con la representación decimal del número hexadecimal.
Paso 2: Ordena las líneas numéricamente en el primer campo.
Paso 3: eliminar la primera columna.
fuente
adaptado de: http://www.unix.com/302548935-post6.html?s=b4b6b3ed50b6831717f6429113302ad6
: archivo a ordenar:
Mando:
Salida:
- donde el toupper ($ 0) "actualiza" las letras minúsculas para que se ordenen primero (¿no está seguro de que sea necesario?)
fuente