awk中的多维数组



我尝试在awk中创建一个伪多维数组。

# Calculate cumulative context score
BEGIN { FS=OFS="t" }
{
        a[$2+FS+$7,$3]+=$6
}
END { for (i,j) in a
        { print i,j,a[i,j] }
}
输出:

awk: ccstscan.awk:9: END { for (i,j) in a
awk: ccstscan.awk:9:             ^ syntax error

这是在GNU awk手册中提到的:

测试是否存在一个特定的索引序列多维数组,使用与用于的相同的操作符(in)单维数组。把整个下标序列写在括号,以逗号分隔,作为左操作数:

 (subscript1, subscript2, ...) in array

我尝试修改脚本来创建一个真正的多维数组:

BEGIN { FS=OFS="t" }
{
    a[$2+FS+$7][$3]+=$6
}
END { for i in a
    {
     for j in a[i]
        { print i,j,a[i][j]
        }
    }
}

我用gawk运行它。它还给出了一个错误:

gawk: ccstscan.awk:6:   a[$2+FS+$7][$3]+=$6
gawk: ccstscan.awk:6:              ^ syntax error
gawk: ccstscan.awk:9: END { for i in a
gawk: ccstscan.awk:9:           ^ syntax error
gawk: ccstscan.awk:11:   for j in a[i]
gawk: ccstscan.awk:11:       ^ syntax error
gawk: ccstscan.awk:11:   for j in a[i]
gawk: ccstscan.awk:11:             ^ syntax error
gawk: ccstscan.awk:12:          { print i,j,a[i][j]
gawk: ccstscan.awk:12:                          ^ syntax error

制作和扫描多维关联数组的正确格式是什么

如果您正在使用模拟的多维数组,那么您的循环将需要像这样:

  END { 
    for (ij in a) {
      split(ij,indices,SUBSEP);
      i=indices[1];
      j=indices[2];
      print i,j,a[ij]
    }
  }

(i,j) in a语法仅用于测试特定索引是否在数组中。它不能用于for循环,尽管for循环允许类似的语法。

对于真正的多维数组(数组的数组),您可以这样写:

BEGIN { FS=OFS="t" }
{ a[$2+FS+$7][$3]+=$6 }
END { 
  for (i in a) {
    for (j in a[i]) { 
      print i,j,a[i][j]
    }
  }
}

但是,数组的数组只在gawk 4.0中添加,所以您的gawk版本可能不支持它。

另一个注意事项:在这行:

a[$2+FS+$7,$3]+=$6

看起来您正在尝试连接$2,FS和$7,但是"+"是用于数字相加,而不是连接。你需要这样写:

a[$2 FS $7,$3] += $6

相关内容

  • 没有找到相关文章

最新更新