我尝试在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