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ソートの-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")

しかし、空白で区切られたさまざまな値を持つ単純な文字列ではなく、配列を使用する必要があることはほぼ確実です。これを行わない唯一の実際の理由は、使用しているシェル(たとえば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")

おすすめ記事