Сортировка пространства разграничила числа с Linux/Bash

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

17
задан codeforester 29 April 2017 в 18:51
поделиться

7 ответов

Вот простой пример, который поможет вам начать работу:

echo "81 4 6 12 3 0" | tr "" "\ n" | sort -g

tr переводит пробелы, ограничивающие числа, в символы возврата каретки, поскольку sort использует символы возврата каретки в качестве разделителей (т. е. для сортировки строк текста). Параметр -g указывает сортировке выполнять сортировку по «общему числовому значению».

man sort для получения дополнительных сведений о sort .

34
ответ дан 30 November 2019 в 10:49
поделиться

Используя расширение параметра Bash (для замены пробелов на новые строки), мы можем сделать:

str="3 2 11 15 8" 
sort -n <<< "${str// /$'\n'}"

# alternative
NL=$'\n'
str="3 2 11 15 8"
sort -n <<< "${str// /${NL}}"
1
ответ дан 30 November 2019 в 10:49
поделиться
$ awk 'BEGIN{split(ARGV[1], numbers);for(i in numbers) {print numbers[i]} }' \
     "6 7 4 1 2 3" | sort -n
0
ответ дан 30 November 2019 в 10:49
поделиться

Это вариант ответа 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
3
ответ дан 30 November 2019 в 10:49
поделиться

Если у вас действительно есть строка чисел, разделенных пробелами, то один из других предоставленных ответов будет работать нормально. Если ваш список представляет собой массив bash, то:

oldIFS="$IFS"
IFS=$'\n'
array=($(sort -g <<< "${array[*]}"))
IFS="$oldIFS"

может быть лучшим решением. Разделитель новой строки поможет, если вы хотите обобщить сортировку массива строк вместо чисел.

0
ответ дан 30 November 2019 в 10:49
поделиться
$ s=(one two three four)
$ sorted=$(printf "%s\n" ${s[@]}|sort)
$ echo $sorted
four one three two
2
ответ дан 30 November 2019 в 10:49
поделиться

Улучшение "сортировки массивов" Эвана Кролла в Bash путем ограничения области действия IFS одной командой:

printf "%q\n" "${IFS}"
array=(3 2 11 15 8) 
array=($(IFS=$'\n' sort -n <<< "${array[*]}")) 
echo "${array[@]}" 
printf "%q\n" "${IFS}"
0
ответ дан 30 November 2019 в 10:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: