簡體   English   中英

使用 Linux/Bash 對空格分隔的數字進行排序

[英]Sorting space delimited numbers with Linux/Bash

是否有 Linux 實用程序或 Bash 命令可用於對以空格分隔的數字字符串進行排序?

這是一個讓你前進的簡單例子:

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

tr將分隔數字的空格轉換為回車符,因為sort使用回車符作為分隔符(即用於排序文本 )。 -g選項告訴sort按“一般數值”排序。

man sort有關sort更多細節。

這是@JamesMorris回答的變種:

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

而不是tr ,我使用xargs -n1轉換為新行。 最終的xargs是轉換回空格分隔的數字序列。

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

使用Bash參數擴展(用換行替換空格)我們可以:

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

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

如果你實際上有一個以空格分隔的數字字符串,那么提供的其他答案之一就可以正常工作。 如果您的列表是bash數組,那么:

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

可能是更好的解決方案。 如果要概括排序字符串數組而不是數字,換行符分隔符將有所幫助。

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

通過將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}"

我將此添加到我的.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

感謝@FranMowinckel 和其他人的啟發。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM