Comment trier un fichier, en fonction de ses valeurs numériques pour un champ?


114

Exemple file.txt:

  100 foo
  2 bar
  300 tuu

Lors de l'utilisation sort -k 1,1 file.txt, l'ordre des lignes ne changera pas, bien que nous nous attendions à:

  2 bar
  100 foo
  300 tuu

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

Réponses:


149

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

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

Voici donc un exemple ...

sort -n filename

1
Merci à tous! Ceci est câblé, car j'ai parcouru sa page de manuel plusieurs fois et je n'ai pas vu cette option. Ah, j'étais à une page de manuel simplifiée. Zut!
lukmac

1
Veuillez noter que, pour les virgules flottantes, l'utilisation -g, --general-numeric-sortpourrait être plus recommandée. Cela permet en outre la notation scientifique par exemple 1.234E10 etc.
Herpes Free Engineer

103

Si vous triez des chaînes contenant du texte et des nombres, par exemple des noms de fichiers de journaux de roulement, le tri avec sort -nne 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 -Vfait l'affaire:

$ 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

à partir de la page de manuel:

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

1
Cela m'a fait trébucher, alors merci! L'autre chose qui m'a dérangé, du moins sur mon cygwin, c'est que même lorsque je lspasse les sedsubstitutions pour supprimer les lettres et ne laisser que des chiffres, apparemment, la sortie colorée affectait également les choses. Donc courir a ls --color=neveraussi fait une différence.
Max Starkenburg

Génial, -Vc'est exactement ce que je cherchais. Je devrais prendre l'habitude de parcourir d'abord les pages de manuel.
srowley

18

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 que j'obtiens avec la version 6.10 de tri sur Fedora 9.

Fichier d'entrée:

-0.907928466796875
-0.61614990234375
1.135406494140625
0.48614501953125
-0.4140167236328125

Production:

-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 serait d'utiliser sort -n mais uniquement si toutes les valeurs sont positives.

PS: utilisation sort -g renvoie exactement les mêmes résultats pour cet exemple

Éditer:

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

LC_ALL=C sort -n filename.txt

7

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

sort -n -k 1,1 File.txt


1

Vous devez exécuter la commande suivante:

sort -n -k1 filename

Ça devrait le faire :)


-1

Utilisez sort -nr pour trier par ordre décroissant. Référer

Trier

Reportez-vous à la page de manuel ci-dessus pour plus d'informations.


-4
    echo " Enter any values to sorting: "
read n
i=0;
t=0;
echo " Enter the n value: "
for(( i=0;i<n;i++ ))
do
read s[$i]
done
for(( i=0;i<n;i++ ))
do
for(( j=i+1;j<n;j++ ))
do
if [ ${s[$i]} -gt ${s[$j]} ]
then
t=${s[$i]}
s[$i]=${s[$j]}
s[$j]=$t
fi
done
done
for(( i=0;i<n;i++ ))
do
echo " ${s[$i]}  "
done

1
Voulez-vous ajouter un peu d'explication textuelle sur ce que fait ce code?
Stedy
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.