如何在一行中提取awk数组中每个包的fail、testcount、error值?
如何在awk中一行输出每个Package的三类统计值
没问题,这在awk里完全可以实现,而且有几种常用的处理方式,我给你详细说说:
情况1:使用三个独立的一维数组
如果你的数据是按「Package + 统计类型 + 数值」的格式输入(比如每行是pkg1 fail 2这样),可以先把fail、testcount、error分别存入三个一维数组,最后遍历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




