À l'aide de coreutils sort
, comment puis-je trier numériquement par une valeur hexadécimale (champ)? Je m'attendais à quelque chose dans le sens de
sort -k3,3x file_to_sort
cependant, un tel x
n'existe pas.
Edit: La meilleure solution que j'ai trouvée jusqu'à présent est:
{ echo ibase=16; cut -d' ' -f3 file_to_sort; } |
bc | paste -d: - file_to_sort | sort -t: -k1,1n | cut -d: -f2-
où le cut -d' ' -f3
isole le champ de recherche (c'est -k3,3
- cela peut varier, bien sûr), et bc
effectue la conversion en décimal (nécessite un hex en majuscule, sans 0x
préfixe, correspondant à mon cas). Ensuite, je joins, trie et fractionne des colonnes.
-k3,3
? Vous avez des nœuds hexagonaux commençant par 0x et tous de la même longueur? Pas de mélange de majuscules / minuscules? Si oui, ils doivent trier correctement lorsqu'ils sont interprétés comme des chaînes. Peut-être pouvez-vous nous montrer quelques exemples de données?Réponses:
Une solution en
perl
:Explication
Pendant le traitement du fichier, nous créons un tableau de tableau
@h
, chacun de ses éléments est une référence de tableau[$F[-1],$_]
, avec le premier élément est la valeur hexadécimale à comparer et le deuxième élément est la ligne entière.En
END
bloc, nous utilisons la transformation de Schwartzian :Avec chaque élément de
@h
, créez un tableau anonyme, contient la ligne entière ($_->[1]
le deuxième élément de chaque tableau ref in@h
) et la valeur hexadécimale à comparerhex($_->[0])]
Trier au-dessus de la base du tableau sur la valeur hexadécimale
$a->[1] <=> $b->[1]
Obtenez le premier élément de chaque référence de tableau dans un tableau trié,
map { $_->[0] }
puis imprimez le résultat.Mise à jour
Avec la suggestion de @Joseph R, sans utiliser Schwartzian Transform:
Update 2
Après avoir lu le commentaire de Stefan, je pense que cela peut appeler
direct
:la source
print for sort { hex $a->[-1] <=> hex $b->[-1] } @h
? L'hex
opérateur n'est pas assez cher pour justifier un Schwartzian, n'est-ce pas?J'utilise ces données d'exemple:
L'idée est de créer une nouvelle version de ces données avec le champ de tri sous forme décimale. C'est-à-dire
awk
qu'il le convertit, l'ajoute à chaque ligne, le résultat est trié et, comme dernière étape, le champ ajouté est supprimé:Ce qui se traduit par cette sortie:
la source
sort
?Contribution
Tri d'une doublure
Tri étape par étape
Étape 1: Ajoutez une nouvelle première colonne avec la représentation décimale du nombre hexadécimal.
Étape 2: Triez les lignes numériquement sur le premier champ.
Étape 3: supprimez la première colonne.
la source
adapté de: http://www.unix.com/302548935-post6.html?s=b4b6b3ed50b6831717f6429113302ad6
: fichier à trier:
Commander:
Production:
- où le toupper ($ 0) "met à niveau" les lettres minuscules pour qu'elles soient triées en premier (vous n'êtes pas sûr que ce soit nécessaire?)
la source