8 votes

Triage de flottants avec des exposants avec la commande bash 'sort -g'

J'ai un fichier avec des nombres décimaux avec des exposants et je veux les trier. À ma connaissance 'sort -g' est ce dont j'ai besoin. Mais il semble trier les décimaux en ignorant les exposants. Ainsi, la sortie ressemble à ceci (ce qui n'est pas ce que je voulais) :

$ cat file.txt | sort -g
8.387280091e-05
8.391373668e-05
8.461754562e-07
8.547354437e-05
8.831553093e-06
8.936111118e-05
8.959458896e-07

Cela me pose deux questions :

  1. Pourquoi 'sort -g' ne fonctionne pas comme je m'y attends ?
  2. Comment puis-je trier mon fichier en utilisant des commandes bash ?

9voto

Jonatan Öström Points 767

Le problème est que dans certains pays, les paramètres locaux peuvent perturber cela en utilisant , comme séparateur décimal au lieu de . au niveau du système. Vérifiez en tapant locale dans le terminal. Il devrait y avoir une entrée

LC_NUMERIC=en_US.UTF-8

Si la valeur est différente, modifiez-la en éditant le fichier de paramètres régionaux comme suit

sudo gedit /etc/default/locale

C'est tout. Vous pouvez également utiliser temporairement cette valeur en faisant

LC_ALL=C sort -g file.dat

LC_ALL=C est plus rapide à écrire dans le terminal, mais le mettre dans le fichier de paramètres régionaux pourrait ne pas être préférable car cela pourrait altérer d'autres comportements système tels que peut-être le format de l'heure.

9voto

David W. Points 49436

Voici un petit truc :

$ sort -te -k2,2n -k1,1n test.txt 
8,461754562e-07
8,959458896e-07
8,831553093e-06
8,387280091e-05
8,391373668e-05
8,547354437e-05
8,936111118e-05

Le -te divise votre nombre en deux champs par le e qui sépare la mantisse de l'exposant. Le -k2,2 indique de trier d'abord par exposant, puis le -k1,1 indique de trier par votre mantisse ensuite.

Fonctionne avec toutes les versions de la commande sort.

3voto

Debaditya Points 1190

Votre méthode est absolument correcte

cat file.txt | sort -g

Si le code ci-dessus ne fonctionne pas, essayez ceci

sed 's/\./0000000000000/g' file.txt | sort -g | sed 's/0000000000000/\./g'

Convertir '.' en '0000000000000', trier et remplacer de nouveau par '.'. J'ai choisi '0000000000000' pour remplacer afin d'éviter tout désaccord avec les nombres des entrées. Vous pouvez manipuler le nombre par vous-même.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X