web-dev-qa-db-fra.com

Tri en fonction de la valeur numérique du champ dans Bash

Exemple: contenu de File.txt:

  100 foo
  2 bar
  300 tuu

En utilisant 'sort -k 1,1 File.txt', l'ordre des lignes ne changera pas, bien que nous attendions:

  2 bar
  100 foo
  300 tuu

Comment pouvons-nous trier un champ composé de nombres en fonction de la valeur absolue numérique?

102
lukmac

Jetez un coup d’œil à la page page de manuel pour le tri ...

   -n, --numeric-sort
          compare according to string numerical value

Donc, voici un exemple ...

sort -n filename
140
Andrew White

Si vous triez des chaînes composées de texte et de chiffres, par exemple des noms de fichiers de roulement de journaux, effectuez le tri avec sort -n ne fonctionne pas comme prévu:

$ ls |sort -n
output.log.1
output.log.10
output.log.11
output.log.12
output.log.13
output.log.14
output.log.15
output.log.16
output.log.17
output.log.18
output.log.19
output.log.2
output.log.20
output.log.3
output.log.4
output.log.5
output.log.6
output.log.7
output.log.8
output.log.9

Dans ce cas, l'option -V fait le tour:

$ ls |sort -V
output.log.1
output.log.2
output.log.3
output.log.4
output.log.5
output.log.6
output.log.7
output.log.8
output.log.9
output.log.10
output.log.11
output.log.12
output.log.13
output.log.14
output.log.15
output.log.16
output.log.17
output.log.18
output.log.19
output.log.20

depuis la page de manuel:

   -V, --version-sort
          natural sort of (version) numbers within text
89
TMG

Eh bien, la plupart des autres réponses ici se réfèrent à

sort -n

Cependant, je ne suis pas sûr que cela fonctionne pour les nombres négatifs. Voici les résultats obtenus avec la version 6.10 de tri sur Fedora 9.

Fichier d'entrée:

-0.907928466796875
-0.61614990234375
1.135406494140625
0.48614501953125
-0.4140167236328125

Sortie:

-0.4140167236328125
0.48614501953125
-0.61614990234375
-0.907928466796875
1.135406494140625

Ce qui n'est évidemment pas ordonné par valeur numérique.

Ensuite, je suppose qu’une réponse plus précise consisterait à utiliser sort -n mais seulement si toutes les valeurs sont positives.

P.S .: Utilisation de sort -g renvoie exactement les mêmes résultats pour cet exemple

Modifier:

On dirait que les paramètres régionaux affectent la façon dont le signe moins affecte l'ordre ( voir ici ). Afin d'obtenir de bons résultats, je viens de faire:

LC_ALL=C sort -n filename.txt
18
pgilmon

Vous devez utiliser l'option de tri numérique:

sort -n -k 1,1 File.txt
6
Kai Sternad

Utilisation sort -n ou sort --numeric-sort.

3
Roman Cheplyaka

Vous devez faire la commande suivante:

sort -n -k1 filename

Ça devrait le faire :)

1
amc