Как да сортирам файл въз основа на числените му стойности за поле?

Пример 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)


Надникнете в man страницата за sort...

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

Ето един пример...

sort -n filename
person Andrew White    schedule 31.01.2011
comment
Благодаря на всички, хора! Това е свързано, защото прегледах неговата man страница напред-назад няколко пъти и не видях тази опция. А, бях на опростена страница с ръководство. по дяволите! - 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

Не съм сигурен обаче, че това работи за отрицателни числа. Ето резултатите, които получавам с сортиране на версия 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 за сортиране в низходящ ред. Се отнасят

Сортиране

Обърнете се към горната страница Man за допълнителна справка

person Aarish Ramesh    schedule 12.11.2015

person    schedule
comment
Искате ли да добавите малко текстово обяснение за това какво прави този код? - person Stedy; 03.02.2015