2013-09-12 3 views
0

У меня есть этот AWK сценария:Как надежно перебирать поля массива?

!/NaN/{ 
    nodes=$1; 
    range=$2; 
    size=$3; 
    frame=$4; 
    arrRate=$5; 
    type=$6; 
    pl=$7; 

    count[nodes,range,size,frame,arrRate,type,pl]++; 
    sumth[nodes,range,size,frame,arrRate,type,pl]+=$11; 
    sumdel[nodes,range,size,frame,arrRate,type,pl]+=$13; 
    sumdeliv[nodes,range,size,frame,arrRate,type,pl]+=$15; 
    sumthf[nodes,range,size,frame,arrRate,type,pl]+=$17; 
    sumdelf[nodes,range,size,frame,arrRate,type,pl]+=$19; 
    sumdelivf[nodes,range,size,frame,arrRate,type,pl]+=$21; 
} 
END{ 
    for (i in count) { 
     split(i,sep,SUBSEP); 
     for (x in sep) { 
      printf "%s ", sep[x]; 
     } 
     print sumth[i]/count[i], 
      sumdel[i]/count[i], 
      sumdeliv[i]/count[i], 
      sumthf[i]/count[i], 
      sumdelf[i]/count[i], 
      sumdelivf[i]/count[i], 
      count[i] 
    } 
} 

Когда я запускаю его на mawk 1.3.3 я получаю выход, как:

100 10 100 10 0.0001778279 DRAND 0.0 ... 

но когда я бегу на GNU Awk 3.1.5, я получаю:

10 0.0001778279 DRAND 0.7 100 10 100 ... 

или первые столбцы печатаются в другом порядке.

Есть ли надежный способ перебора индексов массива awk, что дает согласованный вывод, независимо от версии awk?

ответ

2

Я думаю, вы можете просто заменить блок кода:

split(i,sep,SUBSEP); 
for (x in sep) { 
    printf "%s ", sep[x]; 
    } 

с

printf "%s ",i 

(x in array) не грантополучатель заказ, если вы должны разделить и напечатать их, вы можете:

n=split(i,sep,SUBSEP); 
for (x=1;x<=n;x++) { 
    printf "%s ", sep[x]; 
    } 
+0

Да, это сработало. Спасибо. Интересно, где кто-то мог найти документацию относительно порядка ... – user000001

+0

Для записи 'printf '% s", i' печатает символ '^ \\' между полями, но последний блок работает отлично. – user000001

+1

@ user000001 http://www.gnu.org/software/gawk/manual/gawk.html#Scanning-an-Array 'Порядок, в котором элементы массива обращаются к этому оператору, определяется внутренним расположением элементы массива в awk и, как правило, не могут управляться или меняться. 'также 1-й абзац следующего раздела – Kent

Смежные вопросы