【问题标题】:round each row in a file bash围绕文件bash中的每一行
【发布时间】:2013-08-08 08:49:36
【问题描述】:

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

cat L_z_expectation.dat | awk '{ print $1 }' | paste -sd+ | bc

有没有办法将“+0.0001”粘贴到每一行,然后在一行中单独将每一行传递给 bc?

【问题讨论】:

  • 一个小问题:你不需要cat 命令。您可以将文件名作为第二个参数传递给awk。见this page

标签: bash list rounding bc


【解决方案1】:

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

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

awk 'BEGIN {s=0;} {s+=$1} END {print s}' L_z_expectation.dat

您可能需要使用printf 而不是print 才能以足够的精度显示数字。

如果您仍想对第一列进行四舍五入,则可以执行以下操作:

awk 'BEGIN {s=0;} {s+=int($1+0.5)} END {print s}' L_z_expectation.dat

【讨论】:

    【解决方案2】:

    我认为只附加它 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
    

    【讨论】:

    • 啊当然。好主意啊。它工作得很好,但是当我尝试设置比例时它不起作用。第一个 bc 仍然将数字返回到它们的完全精度。 cat L_z_expectation.dat | awk '{print "scale=1;"$1"+0.0000000001"'} | bc | paste -sd+ | bc
    • 忘记了 bc 不会设置加法的比例。我通过除以 1.0 来修复它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 2022-07-04
    相关资源
    最近更新 更多