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