有没有可以用来对以空格为分隔符的数字字符串进行排序的Linux工具或Bash命令?
这里有一个简单的例子可以让你开始学习:
echo "81 4 6 12 3 0" | tr " " "\n" | sort -g
tr
命令将数字之间的空格转换成换行符,因为 sort
命令使用换行符作为分隔符(也就是用来排序文本行)。-g
参数告诉 sort
命令按照“通用数字值”进行排序。
请参考 man sort
以获取关于 sort
命令的更多信息。
| tr
,并反转了参数,以便将空格分隔的字符串输出。 - blee-r
。 - Timecho \
echo "81 4 6 12 3 0" | tr " " "\n" | sort -g | tr "\n" " "`` - baz这是对 @JamesMorris 答案的一种变化:
echo "81 4 6 12 3 0" | xargs -n1 | sort -g | xargs
我使用xargs -n1
而不是tr
来进行新行转换。最后的xargs
命令是将数字转换回以空格分隔的序列。
xargs -n1
和 xargs
要那样做呢? - Jacktosexargs
使用 echo
处理输入,其余内容只涉及如何处理参数:-n1
表示每次调用最多一个。 - FranMowinckel$ 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
的值时没有使用echo
,那么字符串中就会有换行符。在这种情况下,如果不用引号回显,则所有内容都会显示在同一行上,但是使用引号回显会显示每个数字都在自己的一行上。无论原始数据是数组还是字符串,这种情况都适用。# 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
$ s=(one two three four)
$ sorted=$(printf "%s\n" ${s[@]}|sort)
$ echo $sorted
four one three two
$(printf "%s\n" ${s[@]}|sort)
定义了一个排序后的值数组sorted。 - Pau Coma Ramirez使用 Bash 参数扩展(将空格替换为换行符),我们可以执行以下操作:
str="3 2 11 15 8"
sort -n <<< "${str// /$'\n'}"
# alternative
NL=$'\n'
str="3 2 11 15 8"
sort -n <<< "${str// /${NL}}"
.zshrc
(或.bashrc
)文件中:#sort a space-separated list of words (e.g. a list of HTML classes)
sortwords() {
echo $1 | xargs -n1 | sort -g | xargs
}
在终端中这样调用:
sortwords "banana date apple cherry"
# apple banana cherry date
oldIFS="$IFS"
IFS=$'\n'
array=($(sort -g <<< "${array[*]}"))
IFS="$oldIFS"
可能有更好的解决方案。如果您想将其推广到对字符串数组进行排序,换行符分隔符会很有帮助。
packages="$(sort <<< ${!package2apk[@]})"
。 - Jayen$ awk 'BEGIN{split(ARGV[1], numbers);for(i in numbers) {print numbers[i]} }' \
"6 7 4 1 2 3" | sort -n
printf "%q\n" "${IFS}"
array=(3 2 11 15 8)
array=($(IFS=$'\n' sort -n <<< "${array[*]}"))
echo "${array[@]}"
printf "%q\n" "${IFS}"