0

我是 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 脚本中做浮点算术和逻辑可能很麻烦,但我希望你们中的一个可以帮助我。在此先感谢您的帮助!

4

1 回答 1

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
于 2013-02-05T20:46:18.643 回答