shell中添加三点浮点数

shell中添加三点浮点数

我尝试使用以下命令将 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 这样的数字被视为八进制。

答案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

相关内容