0

私はstackoverflowとbashスクリプトの作成に不慣れです。私は仕事のためのプロジェクトを行っており、かなり単純なスクリプトを書く必要があります。データの列がいくつかあります。1つは時間で、もう1つは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人が私を助けてくれることを望んでいました。よろしくお願いします!

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 に答える