【问题标题】:awk syntax error a[$1]awk 语法错误 a[$1]
【发布时间】:2018-08-20 12:59:01
【问题描述】:

我有以下 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 } { if($1 % 5 == 0) >>> {a[$1][

我不确定该命令应该做什么,可能会创建某种 ID 查找文件。

【问题讨论】:

    标签: awk syntax-error


    【解决方案1】:

    您在非 GNU awk 中使用了 gawk-only 语法。获取 gawk 或使用 a[$1,$2,$3] 或类似名称而不是 a[$1][$2][$3] 并修复其余代码以匹配。不幸的是,您不仅没有提供任何预期的输出,而且您甚至没有提供 可能 产生任何输出的输入(由 5 修改的 $1 值都没有评估为 0)所以这显然未经测试但这可能是你想要的:

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

    【讨论】:

    • 有关更多详细信息,您可以查看 multidimensional arraysarrays of arrays 上的 gawk 文档
    • 你可以说FS = OFS = SUBSEP = "\t",然后是a[$1,$2,$3] += $4——我认为这样更易读。这适用于 gawk、mawk 和 nawk
    • 我同意这是一种非常合理的方法,但我觉得对于像 OP 这样的新手来说可能有点神秘,所以我想我会保持原样并留下评论,谢谢。它适用于任何 awk - 它们都支持 SUBSEP。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多