数组变量的百分比计算

时间:2020-08-27 08:05:40

标签: linux bash shell scripting

我有如下输入

Topic   Current Log     Lag
abc     324     22345   235
xyz     552     48453   1055
bcd     673     100546  3567

我的要求是找出Log和Lag值之间的百分比差异

如果百分比大于30,则我需要整行打印在某些文件上。

在如下所示的if语句上应用整个百分比公式无效。

if [${log_array[$i]} - ${lag_array[$j] * 100 / ${log_array[i]} -gt 30]

如果[100-70 * 100/100> 30]我需要打印该行。

如何在shell脚本中对数组进行此百分比计算?

2 个答案:

答案 0 :(得分:2)

由于您已经使用awk创建了数组log_arraylag_array,因此建议您在单个awk命令中进行所有操作。这样不仅写起来短,执行起来也快,而且更加精确,因为awk支持浮点数,而bash不支持浮点数。

awk 'NR>1 && ($3-$4)/$3 > 0.3' inputFile

这将从inputFile中读取表格,并打印出 Log-Lag 差异大于 Log 的30%的行。

如果您还想打印使用百分比

awk 'NR>1 && (p=($3-$4)/$3)>0.3 {print $0, p}' inputFile

注意:我认为该公式是错误的,因为示例中的所有百分比均大于90%。您没有完全指定“百分比差异” 的计算方式。但是,我怀疑以下情况:

Log-Lag Log H 百分比:
Log * H/100 = Log-Lag,因此H = (Log-Lag)/Log * 100
现在计算100%( Log 的“百分比”)和 H 之间的差 D
D = 100-H

在这种情况下,脚本将是

awk 'NR>1 && (p=1-($3-$4)/$3)>0.3 {print $0, p}' inputFile

答案 1 :(得分:0)

如果您不介意bash不支持浮点或小数运算的事实而导致精度下降,则可以执行

if (( ${log_array[$i]} - ${lag_array[$j] * 100 / ${log_array[i]} > 20 ))
then
  ...
fi