awk语法错误a[$1]

awk语法错误a[$1],awk,syntax-error,Awk,Syntax Error,我有以下awk命令: awk -F $'\t' 'BEGIN { OFS = FS } { if($1 % 5 == 0) {a[$1][$2][$3]+=$4; } } END {for (i in a) for (j in a[i]) for (k in a[i][j]) print i, j, k, a[i][j][k]}' 以及包含4个元组id列表的输入文件: 9374 2150 26 1 7477 1808 58 1 4972 787 28

我有以下awk命令:

awk -F $'\t' 
'BEGIN 
{ OFS = FS } 
{ if($1 % 5 == 0) {a[$1][$2][$3]+=$4; } } 
END 
{for (i in a) for (j in a[i]) for (k in a[i][j]) print i, j, k, a[i][j][k]}'
以及包含4个元组id列表的输入文件:

9374    2150    26  1
7477    1808    58  1
4972    787 28  1
5617    8342    15  1
等等

当我在输入文件上运行命令时,我得到错误:

awk:源代码行1上下文的语法错误为BEGIN{OFS=FS}{
如果($1%5==0)>>{a[$1][您在非GNU awk中使用的是仅gawk语法。获取gawk或使用
a[$1,$2,$3]
或类似的语法,而不是
a[$1][$2][$3]
并修复其余代码以匹配。不幸的是,您不仅没有提供任何预期的输出,而且您甚至没有提供可以产生任何输出的输入(5修改为0的$1值中没有一个值),因此这显然未经测试,但这可能是您想要的:

BEGIN {
    FS=OFS="\t"
}
($1 % 5) == 0 {
    a[$1 OFS $2 OFS $3] += $4
}
END {
    for (key in keys) {
        print key, a[key]
    }
}

有关更多详细信息,您可以查看上的gawk文档,您可以说
FS=OFS=subsp=“\t”
,然后说
a[$1,$2,$3]+=$4
--我认为这更具可读性。这适用于gawk、mawk和Nawk。我同意这是一个非常合理的方法,但我觉得对于像OP这样的新手来说,这可能有点神秘,所以我想我会保持原样,并将其作为评论,谢谢。这在任何awk中都会起作用-他们都支持Subsp。