如何可靠地迭代数组的字段?

时间:2013-09-12 09:18:40

标签: arrays bash awk indexing iteration

我有这个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版本如何?

1 个答案:

答案 0 :(得分: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];
  }