Bash:使用 awk 等對由空格分隔的字串中的版本號進行排序

Bash:使用 awk 等對由空格分隔的字串中的版本號進行排序

例如,我如何對字串進行排序

 "1.3.2 1.3.1 1.2.3 1.1.1.5"

"1.1.1.5 1.2.3 1.3.1 1.3.2"

所以我不知道版本由多少個數字組成,也不知道字串中有多少個版本。

怎麼解決這個問題呢?

謝謝

答案1

這是少數不引用變數有用的情況之一。

$ string="1.3.2 1.3.1 1.2.3 1.1.1.5"
$ printf "%s\n" $string | sort -V
1.1.1.5
1.2.3
1.3.1
1.3.2

這使用 GNU sort 的-V又名--version-sort選項來對數字進行排序。

您可以將其儲存回變數中,甚至是同一個變數 ( $string):

$ string=$(printf "%s\n" $string | sort -V)
$ echo $string 
1.1.1.5 1.2.3 1.3.1 1.3.2

或一個數組:

$ array=( $(printf "%s\n" $string | sort -V) )
$ typeset -p array
declare -a array=([0]="1.1.1.5" [1]="1.2.3" [2]="1.3.1" [3]="1.3.2")

順便說一句,您幾乎肯定應該使用數組,而不是使用空格分隔多個不同值的簡單字串。不這樣做的唯一真正原因是您使用的 shell(如ash)不支援數組。

例如

$ array=( 1.3.2 1.3.1 1.2.3 1.1.1.5 )
$ typeset -p array
declare -a array=([0]="1.3.2" [1]="1.3.1" [2]="1.2.3" [3]="1.1.1.5")

$ array=( $(printf "%s\n" "${array[@]}" | sort -V) )
$ typeset -p array
declare -a array=([0]="1.1.1.5" [1]="1.2.3" [2]="1.3.1" [3]="1.3.2")

答案2

perl

$ s='1.3.2 1.3.1 1.2.3 1.1.1.5'
$ echo "$s" | perl -Mversion -lane 'print join " ", sort {
                   version->parse($a) cmp version->parse($b) } @F'
1.1.1.5 1.2.3 1.3.1 1.3.2

相關內容