Как отсортировать файл по числовым значениям поля?

114

Пример file.txt:

  100 foo
  2 bar
  300 tuu

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

  2 bar
  100 foo
  300 tuu

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

Lukmac
источник

Ответы:

149

Взгляните на страницу руководства для сортировки ...

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

Итак, вот пример ...

sort -n filename
Эндрю Уайт
источник
1
Всем спасибо, ребята! Это зашито, потому что я несколько раз просматривал его справочную страницу и не видел этой опции. Ах, я был на упрощенной странице руководства. Черт!
lukmac
1
Обратите внимание, что для чисел с плавающей запятой использование -g, --general-numeric-sortможет быть более целесообразным. Это также позволяет использовать научную нотацию, например, 1.234E10 и т. Д.
Herpes Free Engineer
104

Если вы сортируете строки, состоящие из смешанного текста и чисел, например, имена файлов скользящих журналов, тогда сортировка с помощью 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
TMG
источник
1
Это меня сбило с толку, так что спасибо! Другая вещь, которая испортила меня, по крайней мере, на моем cygwin, заключается в том, что даже при прокладке lsсквозных sedподстановок для удаления букв и оставления только цифр, очевидно, цветной вывод также влиял на вещи. Так что бег ls --color=neverтоже имел значение.
Макс Старкенбург
Потрясающе, -Vэто именно то, что я искал. Я должен иметь привычку сначала просматривать справочные страницы.
srowley 06
18

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

sort -n

Однако я не уверен, что это работает для отрицательных чисел. Вот результаты, которые я получил с версией sort 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но только если все значения положительны.

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

Редактировать:

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

LC_ALL=C sort -n filename.txt
пгилмон
источник
7

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

sort -n -k 1,1 File.txt
Кай Стернад
источник
3

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

Роман Чепляка
источник
1

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

sort -n -k1 filename

Это должно сработать :)

AMC
источник
-1

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

Сортировать

См. Приведенную выше страницу руководства для получения дополнительной информации.

Аариш Рамеш
источник
-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
Не хотите добавить небольшое текстовое объяснение того, что делает этот код?
Stedy