【问题标题】:Bash script: specify bc output number formatBash 脚本:指定 bc 输出数字格式
【发布时间】:2016-04-24 10:41:44
【问题描述】:

您好!

我使用 在我的脚本中进行一些计算。例如:

bc
scale=6
1/2
.500000

为了在我的脚本中进一步使用,我需要将“0.500000”替换为“.500000”。

您能帮我为我的案例配置 bc 输出数字格式吗?

【问题讨论】:

    标签: bash format


    【解决方案1】:

    一行:

    printf "%0.6f\n" $(bc -q <<< scale=6\;1/2)
    

    【讨论】:

      【解决方案2】:

      只需在 awk 中进行所有计算和输出:

      float_scale=6
      result=$(awk -v scale=$floatscale 'BEGIN { printf "%.*f\n", scale, 1/2 }')
      

      作为替代方案,如果您希望使用 bc 而不是单独使用 AWK 或与 'bc' 一起使用,Bash 的 printf 支持浮点数,即使 Bash 的其余部分不支持。

      result=$(echo "scale=$float_scale; $*" | bc -q 2>/dev/null)
      result=$(printf '%*.*f' 0 "$float_scale" "$result")
      

      上面的第二行可以改为:

      printf -v $result '%*.*f' 0 "$float_scale" "$result"
      

      类似于sprintf 的工作方式会创建子shell,也不会创建子shell。

      【讨论】:

        【解决方案3】:

        又快又脏,因为scale 只适用于十进制数字,而bc 似乎没有类似sprintf 的功能:

        $ bc
        scale = 6
        result = 1 / 2
        if (0 <= result && result < 1) {
            print "0"
        }
        print result;
        

        【讨论】:

        • 此解决方案+1:无需使用其他工具,例如 awk。
        【解决方案4】:
        echo "scale=3;12/7" | bc -q | sed 's/^\\./0./;s/0*$//;s/\\.$//'
        

        【讨论】:

          【解决方案5】:

          我相信这里是函数的修改版本:

          float_scale=6
          
          function float_eval()
          {
              local stat=0
              local result=0.0
              if [[ $# -gt 0 ]]; then
                  result=$(echo "scale=$float_scale; $*" | bc -q | awk '{printf "%f\n", $0}' 2>/dev/null)
                  stat=$?
                  if [[ $stat -eq 0  &&  -z "$result" ]]; then stat=1; fi
              fi
              echo $result
              return $stat
          }
          

          【讨论】:

            【解决方案6】:

            你能把 bc 的用法放到更好的上下文中吗?您将 bc 的结果用于什么目的?

            在名为some_math.bc的文件中给出以下内容

            scale=6
            output=1/2
            print output
            

            在命令行中,我可以执行以下操作来添加零:

            $ bc -q some_math.bc | awk '{printf "%08f\n", $0}'
            0.500000
            

            如果我只需要输出字符串的格式为零,我会使用 awk。

            【讨论】:

              猜你喜欢
              • 2011-01-20
              • 1970-01-01
              • 2018-07-12
              • 1970-01-01
              • 2016-03-31
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多