変数内のbcの割合を設定します。

変数内のbcの割合を設定します。

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}

$(...)代わりに使用`...`

おすすめ記事