使用 AWK 在特定级别进行汇总 - 即前 2 个值

使用 AWK 在特定级别进行汇总 - 即前 2 个值

我有一个数据文件,其中包含站点、类型和按站点/类型的计数。在完整文件中,有多个站点,每个站点至少有四种不同的类型。我想做的是总结每个网站的前两种类型,然后将其打印出来。我的示例数据文件如下所示;-

Site|Type|Count
site1|A|1 
site1|B|25 
site1|B|66 
site1|D|22 
site1|B|22 
site1|A|45 
site1|A|55 
site1|C|50 
site1|C|55 
site1|A|6 
site1|A|30 
site2|B|21 
site2|D|362 
site2|A|36 
site2|C|2 
site2|A|4 
site2|A|69 
site3|B|36 
site3|C|62 
site3|D|541 
site3|C|55 
site3|A|52 
site3|A|63 
site3|A|52
site4|B|52 
site4|B|55 
site4|D|52 
site4|C|25 
site4|B|55 
site4|A|55 

输出应如下所示:

site1|A|137 
site1|B|113 
site2|A|109 
site2|D|362 
site3|A|167 
site3|D|541 
site4|A|55 
site4|B|162

目前我的AWK程序是这样的:

BEGIN {
  FS="|"
}
{
  site=$1
    type=$2
    nums=$3+0

    key=site","type

    ++recs[key]

    tot[key]+=$3 
}
END {
  for (i in recs) {print i "," tot[i]}
}

有没有人可以帮助我按站点/类型创建总计数组,以便按站点和类型查找并打印前两个值?

答案1

使用 GNU awk 处理数组数组和sorted_in:

$ cat tst.awk
BEGIN { FS=OFS="|" }
NR > 1 {
    tot[$1][$2] += $3
}
END {
    PROCINFO["sorted_in"] = "@val_str_asc"
    for ( site in tot ) {
        cnt = 0
        PROCINFO["sorted_in"] = "@val_num_desc"
        for ( type in tot[site] ) {
            if ( ++cnt < 3 ) {
                print site, type, tot[site][type]
            }
        }
    }
}

$ awk -f tst.awk file
site1|A|137
site1|B|113
site2|D|362
site2|A|109
site3|D|541
site3|A|167
site4|B|162
site4|A|55

相关内容