【问题标题】:Defining a new variable from division of another two variables with bash script使用 bash 脚本从另外两个变量的除法中定义一个新变量
【发布时间】:2020-06-02 08:30:14
【问题描述】:

我有 2 个变量,它们是来自 csv 数据集的 up_votes 和 down_votes。我正在尝试创建一个新变量作为 up_votes / total_votes 的百分比。例如,up_votes=296 down_votes=255,我的输出应该是 53.7 但我得到了 25600。 这是我的方程式。

    x=$col3
    y=$col3+$col4
    z=($x/$y)*100
    ans=$z

【问题讨论】:

  • 您发布的代码不足以重现您的问题:ideone.com/fq6BYp;说 25600 是 256 * 100 并且 256 是您为无效命令获得的退出代码,例如($x/$y)。无论如何 bash 不处理浮点运算,因此您必须使用外部命令,例如 dc

标签: bash shell arithmetic-expressions


【解决方案1】:

因为bash不支持浮点运算,所以需要使用外部程序进行计算

#!/bin/bash


votes="topic1,0,0 topic2,296,255 topic3,3,4"

for vote_data in $votes ; do
    topic=`echo $vote_data|sed -r 's/([^,]*),([^,]*),(.*)/\1/'`
    up_votes=`echo $vote_data|sed -r 's/([^,]*),([^,]*),(.*)/\2/'`
    down_votes=`echo $vote_data|sed -r 's/([^,]*),([^,]*),(.*)/\3/'`

#    echo "$topic , up: $up_votes, down: $down_votes"

    total=`awk "BEGIN {print ($up_votes+$down_votes)}"`
    if [ $total -eq 0 ];then
    ans=divbyzero
    else
    ans=`awk "BEGIN {print 100.0*$up_votes/( $up_votes+$down_votes)}"`
    fi
    echo "$topic $ans [ $up_votes / $down_votes ]"

done

输出:

topic1 divbyzero [ 0 / 0 ]
topic2 53.7205 [ 296 / 255 ]
topic3 42.8571 [ 3 / 4 ]

【讨论】:

  • 实际上,我从 csv 文件中获得了这些选票,因此选票不像您的示例中那样恒定。当我尝试使用变量时,它会给出 awk: 除以零错误。顺便说一下,我正在尝试将此数据集插入到 postgresql 表中。 ideone.com/iNCGYo
  • 所以检查没有投票的情况并跳过这种情况
  • 我检查了前 100 行,没有空票,但第一行返回错误。你确定 awk 语法吗?
  • 我更新了我的答案以检查零以防万一并模拟您的情况。你可以复制粘贴我的代码并运行它来检查它是否有效。
  • 是的,我现在检查了一下,它也适用于我。谢谢。
猜你喜欢
  • 1970-01-01
  • 2015-09-12
  • 1970-01-01
  • 2017-06-18
  • 1970-01-01
  • 1970-01-01
  • 2021-08-01
  • 1970-01-01
  • 2012-11-15
相关资源
最近更新 更多