我有以下awk reducer程序,它在计算键值对中的值时效果很好。
#!/bin/awk -f
BEGIN {FS="\t";
}
{ A[$1]+=$2;
}
END {
for(i in A)
{printf("%s\t %d\n" ,i ,A[i])}
}
以上减速机运行良好,是否有任何优化的方式来编写它??
输入:
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
答案 0 :(得分: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
}
答案 1 :(得分:0)
BEGIN {FS="\t"; OFS="\t "}
{ A[$1]+=$2 }
END {
for(i in A)
print i, A[i]
}
当然,根据您的输入数据以及您实际需要的优化类型,可能会有其他选择。