2010-04-12 60 views

回答

29

这里有一个简单的例子,让你去:

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

tr转换的空间界定的数字,到回车,因为排序使用回车作为分隔符(即它是用于排序线的文字)。 -g选项告诉排序按“一般数值”进行排序。

man sort关于sort的更多细节。

+3

我附加了另一个'| tr'与参数相反以获得空格分隔的字符串。 – isuldor 2012-11-03 03:04:20

+0

要反转排序,请使用'-r'。 – Tim 2016-02-18 11:15:28

2
$ s=(one two three four) 
$ sorted=$(printf "%s\n" ${s[@]}|sort) 
$ echo $sorted 
four one three two 
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 

如果你设置的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 
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}}" 
0

如果你确实有号码的空间分隔的字符串,然后提供将工作的其他答案之一精细。如果您的列表是bash阵列,则:

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

可能是更好的解决方案。如果你想推广到一个字符串数组而不是数字,换行符分隔符会有所帮助。

+0

我的列表是一个bash数组,但这不适用于我:'packages =“$(sort <<< $ {!package2apk [@]})”' – Jayen 2014-06-16 11:00:30

0
$ awk 'BEGIN{split(ARGV[1], numbers);for(i in numbers) {print numbers[i]} }' \ 
    "6 7 4 1 2 3" | sort -n 
+0

虽然此代码片段可能是解决方案,[包括一个解释](// meta.stackexchange.com/questions/114762/explaining-entirely-基于代码的答案)确实有助于提高你的文章的质量。请记住,您将来会为读者回答问题,而这些人可能不知道您的代码建议的原因。 – yivi 2017-11-07 20:09:34

0

通过IFS的范围限制到单个命令提高上埃文克劳的nice击 “数组排序”:

printf "%q\n" "${IFS}" 
array=(3 2 11 15 8) 
array=($(IFS=$'\n' sort -n <<< "${array[*]}")) 
echo "${array[@]}" 
printf "%q\n" "${IFS}" 
3

这是从@JamesMorris答案的变化:

echo "81 4 6 12 3 0" | xargs -n1 | sort -g | xargs 

而不是tr,我用xargs -n1转换为新行。最后的xargs将转换回空格分隔的数字序列。

相关问题