我有如下输入
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脚本中对数组进行此百分比计算?
答案 0 :(得分:2)
由于您已经使用awk
创建了数组log_array
和lag_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