使用awk汇总列中的值

时间:2014-09-04 18:12:17

标签: awk

大家好我有一个看起来像这样的文件:

AAAA  5
BBBB  4
CCCC  12
...

(文件是制表符分隔的,有1000多行)

我感兴趣的是总结第二列值,这是直截了当的:

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

在这3行的情况下,它的值为21.我想要做的是首先对文件中的所有第2列求和,然后打印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”要打印。我一直试图解决这个问题,但似乎无法得到它。任何帮助,将不胜感激。 感谢

1 个答案:

答案 0 :(得分:2)

$ 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