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

これは、変数を引用符で囲まないことが有用な数少ない例の 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 の-Vakaオプションを使用します。--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")

ところで、複数の異なる値を空白で区切った単純な文字列ではなく、配列を使用する方がほぼ確実です。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

関連情報