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?

Lukmac
la source

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
Andrew White
la source
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
TMG
la source
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
pgilmon
la source
7

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

sort -n -k 1,1 File.txt
Kai Sternad
la source
3

Utilisez sort -nou sort --numeric-sort.

Roman Cheplyaka
la source
1

Vous devez exécuter la commande suivante:

sort -n -k1 filename

Ça devrait le faire :)

amc
la source
-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.

Aarish Ramesh
la source
-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
Karthik
la source
1
Voulez-vous ajouter un peu d'explication textuelle sur ce que fait ce code?
Stedy