bcを使用してループ内の2つの値を分割しようとしましたが、その値を変数に設定しました。私の問題は、値に小数点以下の2桁があることを望んでいますが、変数内で定義したときにscale = 2を正しく機能させることができないことです。
これは私のテストファイルです。
cat file.txt
Sc0000000_hap1 0 1200 32939
Sc0000000_hap1 1199 2388 28521
Sc0000001_hap1 0 1200 540
これは私が実行しているループです。
while read name start stop sum; do
divisor=`expr ${stop} - ${start}`
avg=`scale=2; expr $sum / $divisor | bc ` #I want 2 decimal points here
echo ${name} ${start} ${stop} ${avg} >> ${outfile}
done < file.txt
これは私が得た結果です。
Sc0000000_hap1 0 1200 27
Sc0000000_hap1 1199 2388 23
Sc0000001_hap1 0 1200 0
これが私が望む結果です:
Sc0000000_hap1 0 1200 27.45
Sc0000000_hap1 1199 2388 23.99
Sc0000001_hap1 0 1200 0.43
いくつかの構文変換を試しましたが、うまく動作しないようです。誰かがこれを正しくコーディングする方法を教えてもらえますか?よろしくお願いします。
ベストアンサー1
avg=`scale=2; expr $sum / $divisor | bc `
誰ですか
- 設定するシェル変数
scale
は2 - 計算する整数その値を使用して
expr
その値を分割して渡しますbc
(読み取りman expr
)。 - bcは計算を実行せずに入力された数字のみを出力します。
bc
タスクを実行しましょう:
avg=$(echo "scale=2; $sum / ($stop - $start)" | bc)
これで、bcは全体の計算を完了し始めます。紀元前尺度変数。
中かっこは二重引用符とは異なります。使用:
echo "${name} ${start} ${stop} ${avg}" >> ${outfile}
$(...)
代わりに使用`...`