Як сортувати файл, виходячи з його числових значень для поля?


114

Приклад file.txt:

  100 foo
  2 bar
  300 tuu

Під час використання sort -k 1,1 file.txtпорядок рядків не зміниться, хоча ми очікуємо:

  2 bar
  100 foo
  300 tuu

Як сортувати поле, що складається з чисел на основі абсолютного числового значення?

Відповіді:


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

103

Якщо ви сортуєте рядки зі змішаним текстом та цифрами, наприклад, назви файлів журналів, які прокатуються, то сортування з 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

1
Це мене спалохало, тож дякую! Інша справа , що зіпсував мене, по крайней мере , на моєму Cygwin, що навіть тоді , коли пекуче lsчерез sedзаміни , щоб видалити літери і залишити тільки цифри, по- видимому , пофарбована вихід впливала речі , як добре. Тож біг ls --color=neverтакож змінив значення.
— Макс Старкенбург

Дивовижне -V- саме те, що я шукав. Мені варто сформувати звичку переглядати сторінки чоловіка.
— srowley

18

Ну, більшість інших відповідей тут стосуються

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

PS: Використання sort -gповертає ті самі результати для цього прикладу

Редагувати:

Схоже, параметри локалі впливають на те, як знак мінус впливає на порядок ( див. Тут ). Для того, щоб отримати належні результати, я просто зробив:

LC_ALL=C sort -n filename.txt



1

Ви повинні виконати таку команду:

sort -n -k1 filename

Це повинно це робити :)


-1

Використовуйте sort -nr для сортування у порядку зменшення. Зверніться

Сортувати

Перегляньте вищевказану сторінку Man для подальшого ознайомлення


-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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.