在文件bash中对每一行进行四舍五入

在文件bash中对每一行进行四舍五入,bash,list,rounding,bc,Bash,List,Rounding,Bc,我正在使用bash处理一些数据。我通过汇总第一列来检查数据是否完整。它应该由0-500和0.1增量组成。不幸的是,实际数字略有偏差,因此总和可以等于1250653.9,而不是1250250.0。如果我在求和之前将每个数字四舍五入,这是可以避免的。目前,我使用以下方法: cat L_z_expectation.dat | awk '{ print $1 }' | paste -sd+ | bc awk 'BEGIN {s=0;} {s+=int($1+0.5)} END {print s}' L

我正在使用
bash
处理一些数据。我通过汇总第一列来检查数据是否完整。它应该由0-500和0.1增量组成。不幸的是,实际数字略有偏差,因此总和可以等于1250653.9,而不是1250250.0。如果我在求和之前将每个数字四舍五入,这是可以避免的。目前,我使用以下方法:

cat L_z_expectation.dat | awk '{ print $1 }' | paste -sd+ | bc
awk 'BEGIN {s=0;} {s+=int($1+0.5)} END {print s}' L_z_expectation.dat

有没有一种方法可以将“+0.0001”粘贴到每一行,然后将每一行单独管道连接到bc?

我认为只需将其附加到awk即可

cat L_z_expectation.dat | awk '{ print $1 "+0.0001"}' | paste -sd+ | bc
还是需要省略粘贴

cat L_z_expectation.dat | awk '{ print $1 "+0.0001"}' | bc

awk的大多数实现似乎都使用双精度浮点数,所以它可以满足您的需要

因此,您只能使用
awk
来满足您的需求:

awk 'BEGIN {s=0;} {s+=$1} END {print s}' L_z_expectation.dat
您可能需要使用
printf
而不是
print
来显示足够精度的数字

如果仍要将第一列四舍五入,则可以执行以下操作:

cat L_z_expectation.dat | awk '{ print $1 }' | paste -sd+ | bc
awk 'BEGIN {s=0;} {s+=int($1+0.5)} END {print s}' L_z_expectation.dat

旁白:您不需要
cat
命令。您可以将文件名作为第二个参数传递给
awk
。当然可以。这是个好主意。它工作得很好,但当我试着设置刻度时,它不起作用。第一个bc仍然将数字返回到其全部精度<代码>cat L|u z|u expectation.dat | awk'{print“scale=1;“$1”+0.000000000 1”}bc |粘贴-sd+| bc忘记了bc不会通过添加设置比例。我把它除以1.0