You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在一行中提取awk数组中每个包的fail、testcount、error值?

如何在awk中一行输出每个Package的三类统计值

没问题,这在awk里完全可以实现,而且有几种常用的处理方式,我给你详细说说:

情况1:使用三个独立的一维数组

如果你的数据是按「Package + 统计类型 + 数值」的格式输入(比如每行是pkg1 fail 2这样),可以先把failtestcounterror分别存入三个一维数组,最后遍历Package统一输出一行。

示例脚本

BEGIN {
    # 打印表头,用制表符分隔更清晰
    print "Package\tFail\tTestCount\tError"
}
# 处理每一行输入
{
    if ($2 == "fail") {
        fail[$1] = $3
    } else if ($2 == "testcount") {
        testcount[$1] = $3
    } else if ($2 == "error") {
        error[$1] = $3
    }
}
# 所有数据处理完后统一输出
END {
    # 遍历所有Package(这里用fail数组的下标,假设每个Package都有fail统计)
    for (pkg in fail) {
        # 用printf格式化输出,确保一行展示三个值
        # 如果担心某个统计值缺失,可以用 +0 给默认值0,比如 fail[pkg]+0
        printf "%s\t%d\t%d\t%d\n", pkg, fail[pkg], testcount[pkg], error[pkg]
    }
}

情况2:使用二维数组

如果你更喜欢用一个数组管理所有统计值,可以用awk的二维数组(本质是用逗号分隔下标,awk会自动拼接成字符串键),同时收集所有Package去重,最后遍历输出。

示例脚本

BEGIN {
    print "Package\tFail\tTestCount\tError"
}
{
    # 二维数组:stats[Package, 统计类型] = 数值
    stats[$1, $2] = $3
    # 收集所有Package到数组去重
    packages[$1] = 1
}
END {
    # 遍历去重后的Package列表
    for (pkg in packages) {
        # 取出对应统计值,同样可以用 +0 处理缺失值
        printf "%s\t%d\t%d\t%d\n", pkg, stats[pkg, "fail"]+0, stats[pkg, "testcount"]+0, stats[pkg, "error"]+0
    }
}

额外小技巧

  • 如果你的输入格式不是每行一个统计值,而是其他格式,只需要调整中间的赋值逻辑就行,核心都是先按Package聚合所有统计值,最后遍历Package一次性输出
  • 要是需要自定义分隔符(比如逗号),把printf里的\t换成","即可,方便后续导入表格工具。

内容的提问来源于stack exchange,提问作者Abrar Ahamed

火山引擎 最新活动