Сортировка по числовому значению поля в Bash
пример: содержимое файла.txt:
100 foo
2 bar
300 tuu
при использовании ' sort-k 1,1 File.txt', порядок строк не изменится, хотя мы ожидаем:
2 bar
100 foo
300 tuu
Как мы можем сортировать поле, состоящее из чисел, основанных на абсолюте численное значение?
8 ответов:
взгляните на страница для сортировки...
-n, --numeric-sort compare according to string numerical valueИтак, вот пример...
sort -n filename
если вы сортируете строки, которые являются смешанным текстом и числами, например имена файлов прокатных журналов, то сортировка с
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из man page:
-V, --version-sort natural sort of (version) numbers within text
Ну, большинство других ответов здесь относятся к
, Я не уверен, что это работает для отрицательных чисел. Вот результаты, которые я получаю с сортировкой версии 6.10 на Fedora 9.sort -nвходной файл:
-0.907928466796875 -0.61614990234375 1.135406494140625 0.48614501953125 -0.4140167236328125выход:
-0.4140167236328125 0.48614501953125 -0.61614990234375 -0.907928466796875 1.135406494140625который, очевидно, не упорядочен по числовому значению.
тогда, я думаю, что более точный ответ будет использовать
sort -nно только если все значения положительны.П. С.: С Помощью
sort -gвозвращает точно такие же результаты для этого примераEdit:
похоже, что настройки локали влияют на то, как знак минус влияет на порядок (посмотреть здесь). Для того, чтобы получить правильные результаты, я просто сделал:
LC_ALL=C sort -n filename.txt
используйте sort-nr для сортировки в порядке убывания. См.
обратитесь к приведенной выше справочной странице для получения дополнительной информации
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
Comments