次のコマンドを使用して、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