1

我有下面的 awk reducer 程序,它在计算键值对中的值时效果很好。

#!/bin/awk -f

BEGIN {FS="\t";
}
{       A[$1]+=$2;      
}
END {
        for(i in A)    
        {printf("%s\t %d\n" ,i ,A[i])}
}

上面的reducer效果很好,有没有优化的写法...?

输入:

APPLE 1
APPLE 1
 1
ORANGE  1
ORANGE  1
MANGO 1
BANANA 1
 1
 1
 1
ORANGE  1
 1
APPLE 1
BANANA 1

输出:

APPLE 3
BANANA 2
MANGO 1
ORANGE 3
 5
4

2 回答 2

1

取决于您对优化的定义 - 您当前的解决方案受到限制,因为它必须将整个结果集维护在关联数组中。另一种方法是将字段 1 与先前的值进行比较,如果匹配则更新计数,否则输出先前的值和计数。使用这种方法,您可以随时输出结果。我不知道使用此算法的性能成本,但就像我之前所说,它不受内存限制:

BEGIN {
  FS = "\t";
  OFS = "\t";
}
{ 
  if ($1 != prev) { 
    if (prev != "") { print prev, count;} 
    prev=$1; 
    count=0;
  }
  count += $2 
}
END { 
  print prev, count
}
于 2013-07-28T17:08:42.743 回答
0
BEGIN {FS="\t"; OFS="\t "}
{ A[$1]+=$2 }
END {
    for(i in A)    
        print i, A[i]
}

当然,根据您的输入数据和您实际寻找的优化类型,可能会有其他选择。

于 2013-07-28T23:39:54.103 回答