GNU/Linux >> Tutoriales Linux >  >> Linux

¿Ordenar por valor hexadecimal?

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 comparar hex($_->[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

Linux
  1. ¿Cómo ordenar la salida Du por tamaño?

  2. ¿El valor máximo de la identificación del proceso?

  3. ¿Encontrar archivos o directorios más grandes?

  4. ¿Ordenar parte de un archivo?

  5. ¿Ordenar salida por columna?

Comando de clasificación de Linux con ejemplos

Valor porcentual con GNU Diff

PID máximo en Linux

Prevención del desbordamiento de enteros C

Valor de retorno de x =os.system(..)

Cómo ordenar un archivo en el lugar