使用awk对列中的值求和

使用awk对列中的值求和,awk,Awk,嗨,我有一个文件,看起来像这样: AAAA 5 BBBB 4 CCCC 12 ... AAAA 5 0.2380 BBBB 4 0.1904 CCCC 12 0.5714 (文件以制表符分隔,有1000多行) 我感兴趣的是对第二列值求和,这是直截了当的: awk '{sum +=$2}END{print sum}' 对于这3行,其值为21。我要做的是首先对文件中的所有第二列求和,然后打印col1,col2,col2/sum。因此,输出将如下所示: AAAA 5 BBBB 4 CC

嗨,我有一个文件,看起来像这样:

AAAA  5
BBBB  4
CCCC  12
...
AAAA 5 0.2380
BBBB 4 0.1904
CCCC 12 0.5714
(文件以制表符分隔,有1000多行)

我感兴趣的是对第二列值求和,这是直截了当的:

awk '{sum +=$2}END{print sum}'
对于这3行,其值为21。我要做的是首先对文件中的所有第二列求和,然后打印col1,col2,col2/sum。因此,输出将如下所示:

AAAA  5
BBBB  4
CCCC  12
...
AAAA 5 0.2380
BBBB 4 0.1904
CCCC 12 0.5714
我尝试的是:

awk '{sum +=$2}END{print $1,$2,$2/sum}'
但它似乎不起作用,我得到的只是要打印的“CCCC120.5714”。我一直想弄明白,但似乎弄不明白。任何帮助都将不胜感激。 谢谢

要保持输入顺序,请执行以下操作:

$ 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