Usando coreutils sort
, como posso classificar numericamente por um valor hexadecimal (campo)? Eu estava esperando algo do tipo
sort -k3,3x file_to_sort
no entanto, tal x
não existe.
Edit: A melhor solução que eu vim até agora é:
{ echo ibase=16; cut -d' ' -f3 file_to_sort; } |
bc | paste -d: - file_to_sort | sort -t: -k1,1n | cut -d: -f2-
onde cut -d' ' -f3
isola o campo de pesquisa (isto é -k3,3
- isso pode variar, é claro) e bc
faz a conversão para decimal (requer hexa maiúsculo, sem 0x
prefixo, correspondente ao meu caso). Então eu ingresso, ordeno e divido colunas.
-k3,3
? Você tem hexadecimais com 0x e todos do mesmo comprimento? Nenhuma mistura de maiúsculas / minúsculas? Se sim, eles devem classificar corretamente quando interpretados como strings. Talvez você possa nos mostrar alguns dados de exemplo?Respostas:
Uma solução em
perl
:Explicação
Durante o processamento do arquivo, criamos uma matriz de matriz
@h
, cada um de seus elementos é uma referência de matriz[$F[-1],$_]
, com o primeiro elemento é o valor hexadecimal a ser comparado e o segundo elemento é a linha inteira.No
END
bloco, usamos a transformação Schwartziana :Com cada elemento de
@h
, crie uma matriz anônima, contém a linha inteira ($_->[1]
o segundo elemento de cada matriz ref in@h
) e o valor hexadecimal para compararhex($_->[0])]
Classifique acima da base da matriz no valor hexadecimal
$a->[1] <=> $b->[1]
Obtenha 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 a Schwartzian Transform:
Atualização 2
Depois de ler o comentário de stefan, acho que isso pode chamar
direct
:fonte
print for sort { hex $a->[-1] <=> hex $b->[-1] } @h
:? Ohex
operador dificilmente é caro o suficiente para justificar um schwartziano, não é?Eu uso esses dados de exemplo:
A idéia é criar uma nova versão desses dados com o campo de classificação na forma decimal. Ou seja,
awk
converte-o, anexa-o a cada linha, o resultado é classificado e, na última etapa, o campo adicionado é removido:O que resulta nesta saída:
fonte
sort
?Entrada
Classificando um forro
Classificando passo a passo
Etapa 1: adicione uma nova primeira coluna com a representação decimal do número hexadecimal.
Etapa 2: classifique as linhas numericamente no primeiro campo.
Etapa 3: remova a primeira coluna.
fonte
adaptado de: http://www.unix.com/302548935-post6.html?s=b4b6b3ed50b6831717f6429113302ad6
: arquivo a classificar:
Comando:
Resultado:
- onde o toupper ($ 0) "atualiza" as letras minúsculas para que elas sejam classificadas primeiro (não tem certeza de que é necessário?)
fonte