【问题标题】:gawk do twice asorti() errorgawk 做两次 asorti() 错误
【发布时间】:2013-12-30 06:35:34
【问题描述】:

我正在尝试按它们的值对数组(字典)进行排序,同时保持正确的键。 我有个问题。我已经编写了执行该任务的代码,但是当我重复调用该函数时,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

您可以看到第二个、第三个和第四个 Top 没有任何顺序。如果我更改调用顺序,该程序始终适用于第一个调用函数。任何想法?有什么解决办法吗?
感谢您的宝贵时间!
维克多

【问题讨论】:

  • 是的,抱歉,它是一个常量变量,在这种情况下 sizeTop=10

标签: awk gawk


【解决方案1】:

您忘记在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]]
}

(假设您删除了 printTop(sizeTop,IPdstBytes,NULL); 中的 NULL 。即:将函数调用为 printTop(sizeTop,IPdstBytes); 代替)

【讨论】:

  • 哦!是的!非常感谢你的帮助,你说的很对,我还是不太适应awk
猜你喜欢
  • 1970-01-01
  • 2010-11-18
  • 1970-01-01
  • 2021-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多