我正在尝试按其值排序数组(字典),同时保持正确的键。 我有个问题。我编写了一个执行任务的代码,但是当我反复调用该函数时,printTop只能在第一次调用时正常工作。
我的gawk功能是:
function printTop(n,array){
for (i in array) tmpidx[sprintf("%12s", array[i]),i] = i
num = asorti(tmpidx,ind)
j=0
for (i=1; i<=num; i++) {
split(ind[i], tmp, SUBSEP)
indices[++j] = tmp[2] # tmp[2] is the name
}
for (i=num; i>num-n && i>0; i--)print indices[i]"\t"array[indices[i]]
}
我在下一个脚本中调用它:
'gawk{
IPsrcPkg[$1]+=$8;
IPdstPkg[$2]+=$8;
IPsrcBytes[$1]+=$9;
IPdstBytes[$2]+=$9;
}
END {
printTop(sizeTop,IPdstBytes,NULL);
printTop(sizeTop,IPsrcPkg,NULL);
printTop(sizeTop,IPdstPkg,NULL);
printTop(sizeTop,IPsrcBytes,NULL);
}'
结果是:
TOP5 IP_DST por Bytes:
148.244.42.179 15404514
187.137.83.175 11962637
148.244.42.173 10698849
173.194.46.21 9479857
70.37.119.14 5551644
TOP5 IP_SRC por paquetes:
148.244.42.179 32479
187.137.83.175 11626
148.244.42.173 34471
173.194.46.21 32503
70.37.119.14
TOP5 IP_DST por paquetes:
148.244.42.179 22127
187.137.83.175 14899
148.244.42.173 33697
173.194.46.21 32763
70.37.119.14 5548
TOP5 IP_SRC por Bytes:
148.244.43.5 24157292
148.244.42.179 11055963
65.52.32.92 15308768
187.137.83.175 700023
148.244.42.179 11055963
您可以看到第二,第三和第四名上衣没有任何订单。如果我更改了呼叫顺序,则程序始终适用于第一个呼叫功能。任何的想法?有解决方案吗
谢谢你的时间!
维克多
答案 0 :(得分:0)
您忘记在printTop
中声明局部变量。尝试:
function printTop(n,array, i, tmpidx, j, num, indices) {
for (i in array)
tmpidx[sprintf("%12s", array[i]),i] = i
num = asorti(tmpidx,ind)
j=0
for (i=1; i<=num; i++) {
split(ind[i], tmp, SUBSEP)
indices[++j] = tmp[2] # tmp[2] is the name
}
for (i=num; i>num-n && i>0; i--)
print indices[i]"\t"array[indices[i]]
}
(假设您删除NULL
中的printTop(sizeTop,IPdstBytes,NULL);
。即:将该函数调用为printTop(sizeTop,IPdstBytes);
而不是