Сортировка по числовому значению поля в Bash - PullRequest
100 голосов
/ 31 января 2011

Пример: содержимое файла File.txt:

  100 foo
  2 bar
  300 tuu

При использовании 'sort -k 1,1 File.txt' порядок строк не изменится, хотя мы ожидаем:

  2 bar
  100 foo
  300 tuu

Как мы можем отсортировать поле, состоящее из чисел, основанных на абсолютном числовом значении?

Ответы [ 8 ]

137 голосов
/ 01 февраля 2011

Загляните на справочную страницу для сортировки ...

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

Так вот пример ...

sort -n filename
87 голосов
/ 03 декабря 2015

Если вы сортируете строки со смешанным текстом и числами, например, имена файлов скользящих журналов, тогда сортировка с sort -n не работает должным образом:

$ 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

В этом случае опция -Vделает трюк:

$ 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

со страницы руководства:

   -V, --version-sort
          natural sort of (version) numbers within text
18 голосов
/ 12 февраля 2013

Ну, большинство других ответов здесь относятся к

sort -n

Однако я не уверен, что это работает для отрицательных чисел. Вот результаты, которые я получаю в версии 6.10 для Fedora 9.

Входной файл:

-0.907928466796875
-0.61614990234375
1.135406494140625
0.48614501953125
-0.4140167236328125

Выход:

-0.4140167236328125
0.48614501953125
-0.61614990234375
-0.907928466796875
1.135406494140625

Который явно не упорядочен по числовому значению.

Тогда, я думаю, более точным ответом было бы использование sort -n, но только если все значения положительны.

P.S .: Использование sort -g возвращает точно такие же результаты для этого примера

Edit:

Похоже, настройки локали влияют на то, как знак минус влияет на порядок ( см. Здесь ). Для получения правильных результатов я просто сделал:

LC_ALL=C sort -n filename.txt
6 голосов
/ 01 февраля 2011

Вы должны использовать числовую опцию сортировки:

sort -n -k 1,1 File.txt
3 голосов
/ 01 февраля 2011

Используйте sort -n или sort --numeric-sort.

1 голос
/ 12 марта 2016

Вы должны выполнить следующую команду:

sort -n -k1 filename

Это должно сделать это:)

0 голосов
/ 12 ноября 2015

Используйте sort -nr для сортировки по убыванию. См

Сортировка

Обратитесь к справочной странице выше для дальнейшей справки

0 голосов
/ 03 февраля 2015
    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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...