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

Пример file.txt:

  100 foo
  2 bar
  300 tuu

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

  2 bar
  100 foo
  300 tuu

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


person lukmac    schedule 31.01.2011    source источник


Ответы (8)


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

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

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

sort -n filename
person Andrew White    schedule 31.01.2011
comment
Всем спасибо, народ! Это запрограммировано, потому что я несколько раз просматривал его справочную страницу и не видел такой опции. А, я был на упрощенной справочной странице. Проклятие! - person lukmac; 01.02.2011
comment
Обратите внимание, что для плавающих запятых использование -g, --general-numeric-sort может быть более целесообразным. Это также позволяет использовать научную нотацию, например. 1.234E10 и т. д. - person Herpes Free Engineer; 04.04.2018

Если вы сортируете строки, которые содержат смешанный текст и числа, например, имена файлов скользящих журналов, то сортировка с помощью 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
person TMG    schedule 02.12.2015
comment
Это меня сбило с толку, так что спасибо! Другая вещь, которая меня смутила, по крайней мере, на моем cygwin, заключается в том, что даже при передаче замен ls через sed для удаления букв и оставления только цифр, по-видимому, цветной вывод также влиял на вещи. Так что запуск ls --color=never тоже имел значение. - person Max Starkenburg; 12.02.2016
comment
Отлично, -V это именно то, что я искал. Я должен взять за привычку сначала просматривать справочные страницы. - person srowley; 06.12.2019
comment
Действительно, -V была той версией, которая мне была нужна! - person 9-Pin; 25.02.2021

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

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, но только если все значения положительны.

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

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

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

LC_ALL=C sort -n filename.txt
person pgilmon    schedule 12.02.2013

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

sort -n -k 1,1 File.txt
person Kai Sternad    schedule 31.01.2011

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

person Roman Cheplyaka    schedule 31.01.2011

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

sort -n -k1 filename

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

person amc    schedule 11.03.2016

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

Сортировка

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

person Aarish Ramesh    schedule 12.11.2015

person    schedule
comment
Хотите добавить небольшое текстовое объяснение того, что делает этот код? - person Stedy; 03.02.2015