数组变量的百分比计算

Percentage calculation on array variables

我有如下输入

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]

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

如何在 shell 脚本中处理数组的百分比计算?

如果您不介意因 bash 不支持浮点或小数运算而造成的精度损失,您可以执行

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

因为您已经使用 awk 创建数组 log_arraylag_array,所以我建议在一个 awk 命令中完成所有操作。这不仅写起来更短,执行起来更快,而且更精确,因为 awk 支持浮点数,而 bash 不支持。

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

这从 inputFile 中读取 table 并打印出 Log-Lag 大于 [=35 的 30% 的那些行=]日志.

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

awk 'NR>1 && (p=(-)/)>0.3 {print [=11=], p}' inputFile

注意:我认为公式是错误的,因为您示例中的所有百分比都大于 90%。您没有明确说明应该如何计算 "百分比差异"。但是,我怀疑以下内容:

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

在这种情况下,脚本将是

awk 'NR>1 && (p=1-(-)/)>0.3 {print [=12=], p}' inputFile