Jak posortować plik na podstawie jego wartości liczbowych dla pola?

114

Przykład file.txt:

  100 foo
  2 bar
  300 tuu

Podczas używania sort -k 1,1 file.txtkolejność wierszy się nie zmieni, chociaż oczekujemy:

  2 bar
  100 foo
  300 tuu

Jak posortować pole składające się z liczb na podstawie bezwzględnej wartości liczbowej?

lukmac
źródło

Odpowiedzi:

149

Rzuć okiem na stronę podręcznika, aby posortować ...

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

Oto przykład ...

sort -n filename
Andrew White
źródło
1
Dziękuję wszystkim! Jest to połączone przewodowo, ponieważ przeglądałem jego stronę podręcznika kilka razy w tę iz powrotem i nie widziałem tej opcji. Ach, byłem na uproszczonej stronie podręcznika. Cholera!
lukmac
1
Należy pamiętać, że w przypadku punktów zmiennoprzecinkowych użycie -g, --general-numeric-sortmoże być bardziej wskazane. To dodatkowo umożliwia notację naukową, np. 1.234E10 itp.
Herpes Free Engineer
104

Jeśli sortujesz ciągi zawierające tekst i liczby, na przykład nazwy plików dzienników przewijanych, sortowanie sort -nnie działa zgodnie z oczekiwaniami:

$ 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

W takim przypadku opcja -Vzałatwia sprawę :

$ 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

ze strony podręcznika:

   -V, --version-sort
          natural sort of (version) numbers within text
TMG
źródło
1
To mnie zaskoczyło, więc dziękuję! Inną rzeczą, która mnie zepsuła, przynajmniej na moim cygwinie, jest to, że nawet podczas wykonywania podstawień lsprzez sedprzelotki, aby usunąć litery i zostawić tylko cyfry, najwyraźniej kolorowe wyjście również miało wpływ. Więc bieganie ls --color=neverteż miało znaczenie.
Max Starkenburg
Niesamowite, -Vwłaśnie tego szukałem. Powinienem mieć w zwyczaju przeglądanie najpierw stron podręcznika.
srowley
18

Cóż, większość innych odpowiedzi tutaj dotyczy

sort -n

Jednak nie jestem pewien, czy to działa w przypadku liczb ujemnych. Oto wyniki, które otrzymuję w wersji sortowania 6.10 w Fedorze 9.

Plik wejściowy:

-0.907928466796875
-0.61614990234375
1.135406494140625
0.48614501953125
-0.4140167236328125

Wynik:

-0.4140167236328125
0.48614501953125
-0.61614990234375
-0.907928466796875
1.135406494140625

Który oczywiście nie jest uporządkowany według wartości liczbowej.

Wtedy wydaje mi się, że dokładniejszą odpowiedzią byłoby użycie, sort -nale tylko wtedy, gdy wszystkie wartości są dodatnie.

PS: Użycie sort -gzwraca te same wyniki w tym przykładzie

Edytować:

Wygląda na to, że ustawienia regionalne wpływają na to, jak znak minus wpływa na kolejność ( patrz tutaj ). Aby uzyskać prawidłowe wyniki, właśnie zrobiłem:

LC_ALL=C sort -n filename.txt
pgilmon
źródło
7

Musisz użyć opcji sortowania numerycznego:

sort -n -k 1,1 File.txt
Kai Sternad
źródło
3

Użyj sort -nlub sort --numeric-sort.

Roman Cheplyaka
źródło
1

Musisz wykonać następujące polecenie:

sort -n -k1 filename

Że należy to zrobić :)

amc
źródło
-1

Użyj sort -nr do sortowania w porządku malejącym. Odnosić się

Sortować

Więcej informacji można znaleźć na powyższej stronie podręcznika

Aarish Ramesh
źródło
-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
źródło
1
Chcesz dodać trochę tekstu wyjaśniającego, co robi ten kod?
Stedy