是否有Linux实用程序或Bash命令可用于对以空格分隔的数字字符串进行排序?
答案 0 :(得分:33)
这是一个让你前进的简单例子:
echo "81 4 6 12 3 0" | tr " " "\n" | sort -g
tr
将分隔数字的空格转换为回车符,因为sort使用回车符作为分隔符(即用于排序文本的行)。 -g
选项告诉sort按“一般数值”排序。
man sort
了解有关sort
。
答案 1 :(得分:7)
这是@JamesMorris回答的变种:
echo "81 4 6 12 3 0" | xargs -n1 | sort -g | xargs
我使用tr
转换为新行,而不是xargs -n1
。最后的xargs
是转换回空格分隔的数字序列。
答案 2 :(得分:3)
这是 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 :(得分:2)
$ s=(one two three four)
$ sorted=$(printf "%s\n" ${s[@]}|sort)
$ echo $sorted
four one three two
答案 4 :(得分:1)
使用Bash参数扩展(用换行替换空格)我们可以这样做:
str="3 2 11 15 8"
sort -n <<< "${str// /$'\n'}"
# alternative
NL=$'\n'
str="3 2 11 15 8"
sort -n <<< "${str// /${NL}}"
答案 5 :(得分:0)
如果您实际上有一个以空格分隔的数字字符串,那么提供的其他答案之一就可以正常工作。如果您的列表是bash数组,那么:
oldIFS="$IFS"
IFS=$'\n'
array=($(sort -g <<< "${array[*]}"))
IFS="$oldIFS"
可能是更好的解决方案。如果你想要推广排序字符串数组而不是数字,那么新行分隔符会有所帮助。
答案 6 :(得分:0)
$ awk 'BEGIN{split(ARGV[1], numbers);for(i in numbers) {print numbers[i]} }' \
"6 7 4 1 2 3" | sort -n
答案 7 :(得分:0)
通过将IFS的范围限制为单个命令来改进Evan Krall的漂亮Bash“数组排序”:
printf "%q\n" "${IFS}"
array=(3 2 11 15 8)
array=($(IFS=$'\n' sort -n <<< "${array[*]}"))
echo "${array[@]}"
printf "%q\n" "${IFS}"