2010-04-12 62 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將轉換回空格分隔的數字序列。

相關問題