Bash

在變數內設置 bc 的比例

  • July 21, 2020

我正在嘗試使用 bc 在循環中劃分兩個值,並且我已將該值設置為變數。我的問題是我希望該值具有 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

我已經嘗試了我的語法的一些變化,但我似乎無法讓它工作。有人可以告訴我如何正確編碼嗎?提前致謝。

  avg=`scale=2; expr $sum / $divisor | bc `

你是

  • shell變數設置scale為 2
  • 使用該值計算整數除法expr並將其傳遞給bc(讀取man expr
  • bc 不執行任何計算,它只輸出輸入的數字。

讓我們bc做這項工作:

avg=$(echo "scale=2; $sum / ($stop - $start)" | bc)

現在 bc 開始進行整個計算,並設置bc比例變數。


大括號與雙引號不同。利用:

  echo "${name} ${start} ${stop} ${avg}" >> ${outfile}

使用$(...)代替...

引用自:https://unix.stackexchange.com/questions/599485