【问题标题】:sum values in a column with awk使用 awk 对列中的值求和
【发布时间】:2014-10-29 14:35:27
【问题描述】:

大家好,我有一个如下所示的文件:

AAAA  5
BBBB  4
CCCC  12
...

(文件是制表符分隔的,有数千行)

我感兴趣的是对第二列值求和,这很简单:

awk '{sum +=$2}END{print sum}'

在这 3 行的情况下,其值为 21。我要做的是首先对文件中的所有第二列求和,然后打印 col1、col2、col2/sum。所以输出看起来像这样:

AAAA 5 0.2380
BBBB 4 0.1904
CCCC 12 0.5714

我试过的是这样的:

awk '{sum +=$2}END{print $1,$2,$2/sum}'

但这似乎不起作用,我得到的只是要打印的“CCCC 12 0.5714”。我一直试图弄清楚这一点,但似乎无法理解。任何帮助,将不胜感激。 谢谢

【问题讨论】:

    标签: awk


    【解决方案1】:
    $ awk '{val[$1]=$2; sum+=$2} END{for (key in val) print key, val[key], (sum?val[key]/sum:0)}' file
    CCCC 12 0.571429
    BBBB 4 0.190476
    AAAA 5 0.238095
    

    保持输入顺序:

    $ awk '!($1 in val){keys[++numKeys]=$1} {val[$1]=$2; sum+=$2} END{for (keyNr=1; keyNr<=numKeys;keyNr++) { key=keys[keyNr]; print key, val[key], (sum?val[key]/sum:0)} }' file
    AAAA 5 0.238095
    BBBB 4 0.190476
    CCCC 12 0.571429
    

    并格式化数字:

    $ awk '!($1 in val){keys[++numKeys]=$1} {val[$1]=$2; sum+=$2} END{for (keyNr=1; keyNr<=numKeys;keyNr++) { key=keys[keyNr]; printf "%s %d %.4f\n", key, val[key], (sum?val[key]/sum:0)} }' file
    AAAA 5 0.2381
    BBBB 4 0.1905
    CCCC 12 0.5714
    

    【讨论】:

      猜你喜欢
      • 2015-04-11
      • 1970-01-01
      • 2015-10-08
      • 1970-01-01
      • 1970-01-01
      • 2019-06-12
      • 1970-01-01
      • 2018-12-25
      • 1970-01-01
      相关资源
      最近更新 更多