2013-12-12 2 views
2

올바른 키를 유지하면서 해당 값으로 배열 (사전)을 정렬하려고합니다. 문제가 있습니다. 작업을 수행하는 코드를 작성했지만 함수를 반복적으로 호출하면 printTop은 처음 호출 만 제대로 작동합니다.gawk do asorti() 오류가 발생했습니다.

내 둔한 기능은 다음과 같습니다

'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); 
}' 

결과는 다음과 같습니다 :

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]] 
} 

내가 다음 스크립트에서 호출

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

는'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]] 
} 

(당신이 printTop(sizeTop,IPdstBytes,NULL);NULL을 제거 가정 즉 :. 대신 printTop(sizeTop,IPdstBytes);로 함수를 호출)

+0

오! 네! 도와 주셔서 대단히 감사합니다. 당신은 절대적으로 맞습니다. 나는 여전히 awk에 익숙하지 않습니다. –