Tri des nombres pos / neg avec des parties fractionnaires en utilisant le sorting sous Unix

Utilisation du sort (coreutils) 5.2.1

J’ai le fichier suivant, que je voudrais sortinger par la partie non entière du champ 4. Cela peut être un nombre négatif ou positif, et peut aussi avoir la valeur INF.

 field1 field2 field3 tag=INF field5 field6 field1 field2 field3 tag=INF field5 field6 field1 field2 field3 tag=0.123 field5 field6 field1 field2 field3 tag=4.22 field5 field6 field1 field2 field3 tag=5.77 field5 field6 field1 field2 field3 tag=-1.92 field5 field6 field1 field2 field3 tag=-1.91 field5 field6 field1 field2 field3 tag=INF field5 field6 

Je voudrais que ce soit réglé comme

 field1 field2 field3 tag=-1.92 field5 field6 field1 field2 field3 tag=-1.91 field5 field6 field1 field2 field3 tag=0.123 field5 field6 field1 field2 field3 tag=4.22 field5 field6 field1 field2 field3 tag=5.77 field5 field6 field1 field2 field3 tag=INF field5 field6 field1 field2 field3 tag=INF field5 field6 field1 field2 field3 tag=INF field5 field6 

Étant donné que la partie numéro du champ est à la position 4 (en supposant que l’indexation commence à 0 et que je ne suis pas sûr de cela), j’ai essayé de sort avec les options suivantes:

  • sort -g -k4.4 inputfile
  • sort -g -k4.5 inputfile
  • sort -n -k4.4 inputfile
  • sort -n -k4.5 inputfile
  • sort -g inputfile

Tout cela donne ce qui suit, qui est proche, mais pas tout à fait raison. Les grandeurs sont sortingées correctement, mais j’aime bien la valeur la plus négative.

 field1 field2 field3 tag=0.123 field5 field6 field1 field2 field3 tag=-1.91 field5 field6 field1 field2 field3 tag=-1.92 field5 field6 field1 field2 field3 tag=4.22 field5 field6 field1 field2 field3 tag=5.77 field5 field6 field1 field2 field3 tag=INF field5 field6 field1 field2 field3 tag=INF field5 field6 field1 field2 field3 tag=INF field5 field6 

Comment puis-je faire en sort que le sort se comporte?

FWIW, voici plus d’informations:

 LANG = en_US.UTF-8 Red Hat Enterprise Linux WS release 4 (Nahant Update 6) 

Je suis sur un Mac, ce peut être une implémentation légèrement différente, mais j’ai trouvé que cela fonctionnait:

sort -gb -k 4.5,4 inputfile

En anglais: ” sortinger , en mode numérique -g eneral, en ignorant -b lanks, le fichier d’ entrée du fichier en utilisant les données de l’olumn 4th -k (c) , du 5ème élément de cette colonne à la fin des données du 4 ème colonne ”

 field1 field2 field3 tag=-1.92 field5 field6 field1 field2 field3 tag=-1.91 field5 field6 field1 field2 field3 tag=0.123 field5 field6 field1 field2 field3 tag=4.22 field5 field6 field1 field2 field3 tag=5.77 field5 field6 field1 field2 field3 tag=INF field5 field6 field1 field2 field3 tag=INF field5 field6 field1 field2 field3 tag=INF field5 field6 

Vous pouvez append une étape awk de prétraitement qui ajoute un nouveau champ à la fin contenant la partie numérique ou la représentation numérique du champ 4, et sortinger par ce champ. Ajoutez une étape de post-traitement pour supprimer ce champ. Notez que dans l’exemple ci-dessous, INF a été défini sur une valeur élevée arbitraire de 10**10 , vous pouvez la définir sur une valeur supérieure si vous avez un nombre naturel dans l’entrée qui dépasse cette valeur

 awk '{x=$4; sub("tag=", "", x); sub("INF", 10**10, x); print $0, x}' file.txt | sort -k7,7g | cut -f-6 -d' ' field1 field2 field3 tag=-1.92 field5 field6 field1 field2 field3 tag=-1.91 field5 field6 field1 field2 field3 tag=0.123 field5 field6 field1 field2 field3 tag=4.22 field5 field6 field1 field2 field3 tag=5.77 field5 field6 field1 field2 field3 tag=INF field5 field6 field1 field2 field3 tag=INF field5 field6 field1 field2 field3 tag=INF field5 field6