Подтвердить что ты не робот

Сортировка разделенных пробелами чисел с помощью Linux/Bash

Есть ли утилита Linux или команда Bash, которую я могу использовать для сортировки строки чисел с разделителями пробелов?

4b9b3361

Ответ 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}"