Bash: ordena los números de versión en una cadena separada por espacios en blanco con awk, etc.

Bash: ordena los números de versión en una cadena separada por espacios en blanco con awk, etc.

¿Cómo puedo ordenar una cadena como, por ejemplo?

 "1.3.2 1.3.1 1.2.3 1.1.1.5"

a

"1.1.1.5 1.2.3 1.3.1 1.3.2"

Entonces no sé de cuántos números consta la versión y no sé cuántas versiones hay en la cadena.

¿Cómo solucionar esto?

Gracias

Respuesta1

Este es uno de los pocos casos en los que NO es útil citar una variable.

$ 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

Esto utiliza la opción -Vtambién conocida como GNU sort --version-sortpara ordenar los números.

Puedes volver a almacenarlo en una variable, incluso en la misma variable ( $string):

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

o una matriz:

$ 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")

Por cierto, es casi seguro que debería utilizar una matriz en lugar de una cadena simple con espacios en blanco que separen varios valores diferentes. La única razón real para no hacerlo es si estás usando un shell (como ash) que no admite matrices.

p.ej

$ 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")

Respuesta2

Con 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

información relacionada