【问题标题】:value not matching while trying to find sum of values in a column using awk尝试使用 awk 在列中查找值的总和时值不匹配
【发布时间】:2020-08-27 15:39:47
【问题描述】:

我正在尝试在文本文件的特定列中查找值的总和(负和非负浮点值),并使用 awk 存储在变量中。试过这个命令

bal=`awk -F'|' '{sum += $48} END {printf "%f", sum}' filename`

文件大小为 15GB

我得到的输出是 1168475137587.090576,实际(预期)输出应该是 1168475137572.33,它变化了 14.76,寻找更好的计算方法以获得准确的结果。

【问题讨论】:

    标签: linux unix awk


    【解决方案1】:

    听起来您遇到了浮点算术问题。例如,您可以左移 3 个字符(显然比您的输出所需的精度高一个点),使用作为结果的整数求和,然后再次右移并删除最后一个字符或圆形,但您喜欢:

    awk '
        { val=sprintf("%0.3f",$48); sub(/\./,"",val); sum+=val }
        END {sub(/...$/,".&",sum); printf "%0.2f\n", sum }
    ' file
    

    例如:

    $ cat file
    1
    1.1
    1.12
    1.123
    1.1234
    1.1239
    
    $ awk '
       {
                                        printf "%s", $1
            val=sprintf("%0.3f",$1);    printf " -> %s", val
            sub(/\./,"",val);           printf " -> %s\n", val
            sum+=val
        }
        END { sub(/...$/,".&",sum); printf "%0.2f\n", sum }
     ' file
    1 -> 1.000 -> 1000
    1.1 -> 1.100 -> 1100
    1.12 -> 1.120 -> 1120
    1.123 -> 1.123 -> 1123
    1.1234 -> 1.123 -> 1123
    1.1239 -> 1.124 -> 1124
    6.59
    

    【讨论】:

    • @Raviteja 当你运行我在你的输入文件上发布的脚本时,你会得到什么输出?
    • 您的脚本确实有效,做了一些更改以匹配我的输出,匹配预期值。 bal=awk -F'|' '{val=sprintf("%019.3f", $48);子(/\./,"",val); sum+=val } END { sub(/...$/,".&",sum); printf "%019.2f\n", sum }' 文件名` `
    猜你喜欢
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2015-06-29
    相关资源
    最近更新 更多