Существует ли утилита Linux или команда Bash, которую я могу использовать для сортировки разграниченной строки пространства чисел?
Вот простой пример, который поможет вам начать работу:
echo "81 4 6 12 3 0" | tr "" "\ n" | sort -g
tr
переводит пробелы, ограничивающие числа, в символы возврата каретки, поскольку sort использует символы возврата каретки в качестве разделителей (т. е. для сортировки строк текста). Параметр -g
указывает сортировке выполнять сортировку по «общему числовому значению».
man sort
для получения дополнительных сведений о sort
.
Используя расширение параметра Bash (для замены пробелов на новые строки), мы можем сделать:
str="3 2 11 15 8"
sort -n <<< "${str// /$'\n'}"
# alternative
NL=$'\n'
str="3 2 11 15 8"
sort -n <<< "${str// /${NL}}"
$ awk 'BEGIN{split(ARGV[1], numbers);for(i in numbers) {print numbers[i]} }' \
"6 7 4 1 2 3" | sort -n
Это вариант ответа ghostdog74 , который слишком велик, чтобы поместиться в комментарии. Он показывает цифры вместо имен чисел, и как исходная строка, так и результат находятся в строках, разделенных пробелами (вместо массива, который становится строкой, разделенной новой строкой).
$ s="3 2 11 15 8"
$ sorted=$(echo $(printf "%s\n" $s | sort -n))
$ echo $sorted
2 3 8 11 15
$ echo "$sorted"
2 3 8 11 15
Если вы не использовали эхо
при установке значения sorted
, тогда строка будет содержать символы новой строки. В этом случае повторение его без кавычек помещает все в одну строку, но, как показывает повторение с кавычками, каждое число будет отображаться в отдельной строке. Это тот случай, независимо от того, является ли оригинал массивом или строкой.
# demo
$ s="3 2 11 15 8"
$ sorted=$(printf "%s\n" $s | sort -n)
$ echo $sorted
2 3 8 11 15
$ echo "$sorted"
2
3
8
11
15
Если у вас действительно есть строка чисел, разделенных пробелами, то один из других предоставленных ответов будет работать нормально. Если ваш список представляет собой массив bash, то:
oldIFS="$IFS"
IFS=$'\n'
array=($(sort -g <<< "${array[*]}"))
IFS="$oldIFS"
может быть лучшим решением. Разделитель новой строки поможет, если вы хотите обобщить сортировку массива строк вместо чисел.
$ s=(one two three four)
$ sorted=$(printf "%s\n" ${s[@]}|sort)
$ echo $sorted
four one three two
Улучшение "сортировки массивов" Эвана Кролла в Bash путем ограничения области действия IFS одной командой:
printf "%q\n" "${IFS}"
array=(3 2 11 15 8)
array=($(IFS=$'\n' sort -n <<< "${array[*]}"))
echo "${array[@]}"
printf "%q\n" "${IFS}"