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 -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

Связанный контент