期望整数表达式 - 用于进行线性插值的Bash脚本

时间:2013-02-05 20:39:15

标签: bash floating-point interpolation

我是stackoverflow和编写bash脚本的新手。我正在做一个工作项目,需要编写一个相当简单的脚本。我有几列数据,其中一列是时间,另一列是hrr,这是一个相对于时间不断增加的变量。我正在尝试进行线性插值以找到hrr = hrr中最后一个条目的50%的相应时间。

所以这就是我到目前为止所拥有的:

#!/bin/bash
clear

entry=$(awk 'NR>4{print $11}' thermo.out | awk -F, '{$1=$1*a;print}' a=0.50 | tail -1 )
awk 'NR>4{print $11}' thermo.out | awk -F, '{$1=$1*b;print}' b=1.0 > hrr.out
awk 'NR>4{print $1}' thermo.out > t.out

hrr=($(<hrr.out))
t=($(<t.out))

length=${#t[@]}
end_array=$(($length-1))

#Start looping through hrr from 0 to entry that exceeds 0.50*hrr(end)
ind=0
while [ ${hrr[$ind]} -lt ${entry} ]
do
    echo "ind = $ind"
    ind=$[$ind+1]
done

exit 0

显然,我没有在循环中编写代码来查找感兴趣的hrr条目或进行插值。我试图验证我的代码可以成功进入和退出while循环。因此,当我尝试运行我所拥有的内容时,我收到以下错误

./interp: line 16: [: 796.28: integer expression expected

所以我理解hrr的条目和元素不是整数。我需要做一个简单的变量声明来修复这个错误,还是你能想到一个解决方法?我知道在bash脚本中执行浮点运算和逻辑可能很麻烦,但我希望你们中的一个可以帮助我。在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

Bash根本不支持浮点算术。您可以使用支持定点算术的bc等工具:

while (( $(bc <<< "${hrr[$ind]} < ${entry}") ))
do
    echo "ind = $ind"
    ind=$[$ind+1]
done

如果您的awk以科学记数法输出,您可以尝试

entry=$(awk 'NR>4{print $11}' thermo.out | awk -F, '{$1=$1*a; printf("%f\n",$0);}' a=0.50 | tail -1 )
awk 'NR>4{print $11}' thermo.out | awk -F, '{$1=$1*b; printf("%f\n",$0);}' b=1.0 > hrr.out