Awk

在shell中添加三個點浮點數

  • April 24, 2019

我正在嘗試使用以下命令將 5.34.03 數字附加到 5.34.04

$ awk '{print 5.34.03 + 0.0.1}'
5.340.030.1

預期產出

5.34.13

我嘗試了很多方法,例如。,但它沒有用。

假設您的次要版本和更新檔版本號應該是 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

在 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 這樣的數字被視為八進制。

引用自:https://unix.stackexchange.com/questions/515238