![使用 AWK 在特定级别进行汇总 - 即前 2 个值](https://linux22.com/image/198587/%E4%BD%BF%E7%94%A8%20AWK%20%E5%9C%A8%E7%89%B9%E5%AE%9A%E7%BA%A7%E5%88%AB%E8%BF%9B%E8%A1%8C%E6%B1%87%E6%80%BB%20-%20%E5%8D%B3%E5%89%8D%202%20%E4%B8%AA%E5%80%BC.png)
我有一个数据文件,其中包含站点、类型和按站点/类型的计数。在完整文件中,有多个站点,每个站点至少有四种不同的类型。我想做的是总结每个网站的前两种类型,然后将其打印出来。我的示例数据文件如下所示;-
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