2013-12-12 2 views
2

Я пытаюсь сортировать массив (словарь) по их значениям, сохраняя правильные ключи. У меня проблема. Я написал код, который выполняет задачу, но когда я вызываю функцию повторно, printTop работает только с первым вызовом.gawk do дважды asorti() error

Моя функция простак является:

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 

Вы можете увидеть, как второй, третий , а четвертые вершины не имеют никакого порядка. Если я изменю порядок звонков, программа всегда работает всегда для первой функции вызова. Есть идеи? Любое решение?
Спасибо за ваше время!
Victor

+0

Что такое 'sizeTop'? –

+0

да извините, его константа var, в данном случае sizeTop = 10 –

ответ

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); вместо)

+0

Oh! Да! большое спасибо за вашу помощь, вы абсолютно правы, мне все еще не очень удобно с awk –