基于另一列中重复出现的awk sum列&打印要求和的每个值

时间:2013-12-25 06:41:44

标签: awk

我有类似的输入

A 3
C 1
A 4
B 2
B 2

output should be 
A total=7 (3+4)
C total=1 (1)
B total=4 (2+2)

任何人都可以告诉我如何在awk中这样做吗? 输入是awk行输出的一部分,因此请求awk中的解决方案。 谢谢!

2 个答案:

答案 0 :(得分:1)

我想建议另一种方式:

sort -k 1,1 your_file |
cat - <(echo "") |
gawk '
  $1==key {
    line=line " + " $2; sum+=$2
  }
  $1 != key {
    if (NR>1){print key " total=" sum " (" line ")"}
    key=$1
    line=$2
    sum=$2
  }'

有什么区别?

1)这个awk不使用数组。这在处理大文件时很重要。

2)这更像是AWK方式,而之前的答案更像是编程语言方式。

3)如果原始订单很重要,你可以这样做:

gawk '{print $0 " " NR}' your_file |
sort -k 1,1 | cat - <(echo "") |
gawk '$1==key {line=line " + " $2; sum+=$2} $1 != key {if (NR>1){print nr " " key " total=" sum " (" line ")"}; key=$1; line=$2; sum=$2; nr=$NF}' |
sort -k 1,1n |
cut -d \  -f 2-

答案 1 :(得分:0)

您可以尝试以下代码:

awk '
{
    a[$1]+=$2
    b[$1]=(b[$1]=="")?$2:(b[$1]"+"$2)
}
END {
    for (i in a)
        print i" total="a[i]" ("b[i]")"
}' file

带输出:

A total=7 (3+4)
B total=4 (2+2)
C total=1 (1)