쉘에 3점 부동 소수점 숫자 추가

쉘에 3점 부동 소수점 숫자 추가

다음 명령을 사용하여 5.34.03 번호를 5.34.04에 추가해 보았습니다.

$ awk '{print 5.34.03 + 0.0.1}'
5.340.030.1

예상 출력

5.34.13

나는 많은 방법을 시도했습니다.허락하다, 그러나 성공하지 못했습니다.

답변1

Bash에서는 IFS를 사용하여 각 버전 문자열을 분할하고 해당 번호로 배열을 채울 수 있습니다. 그런 다음 매개변수 확장을 사용하여 숫자의 길이를 가져오고 printf결과 숫자의 형식을 지정하는 데 사용됩니다.

#! /bin/bash
v=5.34.03
a=0.0.1

IFS=.
v=($v)
a=($a)

shopt -s extglob
for ((i=0; i<${#v[@]}; i++)) ; do
    v[i]=${v[i]%%+(0)}
    a[i]=${a[i]%%+(0)}
    v_length=${#v[i]}
    a_length=${#a[i]}
    v[i]=${v[i]##+(0)}
    a[i]=${a[i]##+(0)}
    if (( v_length < a_length )) ; then
        length=$a_length
        (( v[i] *= 10 ** (a_length - v_length) ))
    else
        length=$v_length
        (( a[i] *= 10 ** (v_length - a_length) ))
    fi
    (( v[i] += a[i] ))
    v[i]=$(printf %0"$length"d ${v[i]})
done
IFS=.
echo "${v[*]}"

IFS=$' \t\n'

010과 같은 숫자는 8진수로 처리되므로 선행 및 후행 0을 처리해야 합니다.

답변2

부 버전 번호와 패치 버전 번호가 2자여야 한다고 가정하면 다음 awk 스크립트를 사용할 수 있습니다.

파싱.awk

BEGIN { FS = "[ .]"; OFS = "." }

function tonum(s) {
  if( length(s) < 2 )
    s *= 10
  return s
}

function tover(n) {
  if( n < 10 )
    n = "0" n
  return n
}

{
  print $1 + $4, tover( tonum($2) + tonum($5) ), tover( tonum($3) + tonum($6) )
}

다음과 같이 실행하세요:

echo 5.34.03 0.0.1 | awk -f parse.awk

산출:

5.34.13

관련 정보