我正在尝试使用 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}
使用$(...)
而不是`...`