设置变量内 bc 的比例

设置变量内 bc 的比例

我正在尝试使用 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

我尝试了一些语法变体,但似乎无法让它工作。有人可以告诉我如何正确编码吗?提前致谢。

答案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}

使用$(...)而不是`...`

相关内容