Bash: Classifique os números de versão em uma string separada por espaço em branco com awk etc.

Bash: Classifique os números de versão em uma string separada por espaço em branco com awk etc.

como posso classificar uma string como, por exemplo

 "1.3.2 1.3.1 1.2.3 1.1.1.5"

para

"1.1.1.5 1.2.3 1.3.1 1.3.2"

Portanto, não sei em quantos números a versão consiste e não sei quantas versões existem na string.

Como resolver isso?

Obrigado

Responder1

Este é um dos poucos casos em que NÃO citar uma variável é útil.

$ 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

-VIsso usa a opção também conhecida como classificação GNU --version-sortpara classificar os números.

Você pode armazenar isso de volta em uma variável, até mesmo na mesma variável ( $string):

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

ou uma 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")

Aliás, você quase certamente deveria usar um array em vez de uma string simples com espaços em branco separando vários valores diferentes. A única razão real para não fazer isso é se você estiver usando um shell (como ash) que não suporta matrizes.

por exemplo

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

Responder2

Com 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

informação relacionada