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