Wie sortiere ich eine Datei anhand ihrer numerischen Werte für ein Feld?

114

Beispiel file.txt:

  100 foo
  2 bar
  300 tuu

Bei der Verwendung sort -k 1,1 file.txtändert sich die Reihenfolge der Zeilen nicht, obwohl wir Folgendes erwarten:

  2 bar
  100 foo
  300 tuu

Wie sortiere ich ein aus Zahlen bestehendes Feld nach dem absoluten Zahlenwert?

lukmac
quelle

Antworten:

149

Werfen Sie einen Blick auf die Manpage, um zu sortieren ...

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

Also hier ist ein Beispiel ...

sort -n filename
Andrew White
quelle
1
Ich danke Ihnen allen, Leute! Dies ist verkabelt, weil ich mehrmals über die Manpage hin und her geschaut habe und diese Option nicht gesehen habe. Ah, ich war auf einer vereinfachten Manpage. Verdammt!
Lukmac
1
Bitte beachten Sie, dass für Gleitkommazahlen die Verwendung -g, --general-numeric-sortratsamer sein kann. Dies ermöglicht ferner die wissenschaftliche Notation, z. B. 1.234E10 usw.
Herpes Free Engineer
103

Wenn Sie Zeichenfolgen sortieren, bei denen es sich um gemischten Text und Zahlen handelt, z. B. Dateinamen von fortlaufenden Protokollen, sort -nfunktioniert das Sortieren mit nicht wie erwartet:

$ 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

In diesem Fall -Vmacht die Option den Trick:

$ 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

von der Manpage:

   -V, --version-sort
          natural sort of (version) numbers within text
TMG
quelle
1
Das hat mich gestolpert, also danke! Das andere, was mich, zumindest bei meinem Cygwin, durcheinander gebracht hat, ist, dass selbst wenn die lsdurchgehenden sedSubstitutionen durchgeleitet wurden, um die Buchstaben zu entfernen und nur Zahlen zu hinterlassen, die farbige Ausgabe anscheinend auch die Dinge beeinflusste. Laufen ls --color=nevermachte also auch einen Unterschied.
Max Starkenburg
Genial, -Vgenau das habe ich gesucht. Ich sollte es mir zur Gewohnheit machen, zuerst die Manpages durchzusehen.
Srowley
18

Nun, die meisten anderen Antworten beziehen sich hier

sort -n

Ich bin mir jedoch nicht sicher, ob dies für negative Zahlen funktioniert. Hier sind die Ergebnisse, die ich mit der Sortierversion 6.10 auf Fedora 9 erhalte.

Eingabedatei:

-0.907928466796875
-0.61614990234375
1.135406494140625
0.48614501953125
-0.4140167236328125

Ausgabe:

-0.4140167236328125
0.48614501953125
-0.61614990234375
-0.907928466796875
1.135406494140625

Welches ist offensichtlich nicht nach numerischen Wert geordnet.

Dann denke ich, dass eine genauere Antwort wäre, sort -naber nur, wenn alle Werte positiv sind.

PS: Die Verwendung von sort -gliefert für dieses Beispiel genau die gleichen Ergebnisse

Bearbeiten:

Anscheinend wirken sich die Gebietsschemaeinstellungen darauf aus, wie sich das Minuszeichen auf die Reihenfolge auswirkt ( siehe hier ). Um die richtigen Ergebnisse zu erzielen, habe ich gerade Folgendes getan:

LC_ALL=C sort -n filename.txt
pgilmon
quelle
7

Sie müssen die numerische Sortieroption verwenden:

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

Verwenden Sie sort -noder sort --numeric-sort.

Roman Cheplyaka
quelle
1

Sie müssen den folgenden Befehl ausführen:

sort -n -k1 filename

Das sollte es tun :)

amc
quelle
-1

Verwenden Sie sort -nr zum Sortieren in absteigender Reihenfolge. Verweisen

Sortieren

Weitere Informationen finden Sie auf der obigen Manpage

Aarish Ramesh
quelle
-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
quelle
1
Möchten Sie ein wenig Texterklärung darüber hinzufügen, was dieser Code bewirkt?
Stedy