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 정렬의 -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")

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

관련 정보