在执行 awk group by 时存储列值

在执行 awk group by 时存储列值

我有一个输入文件,其数据如下:

1484523745 96000 2856 25059 0  
1484523745 96000 2856 25150 0  
1484523745 4864960 2856 997962 193  
1484523745 96000 2856 24923 1  
1484523745 280000 2856 61454 12  
1484523746 1179968 2856 309430 1  
1484523746 4864960 2856 1115576 300  
1484523746 96000 2856 25059 0  
1484523746 4864960 2856 997962 116  
1484523746 96000 2856 25059 0  
1484523746 96000 2856 25059 0  
1484523746 4864960 2856 1146028 211  
1484523746 4864960 2856 1115576 371  
1484523746 3184960 2856 875340 1  

要求是根据第 2 列和第 3 列的唯一组合查找第 4 列和第 5 列的聚合,查找每个唯一组合的计数,并使用每个唯一组合第一次出现的第 1 列(纪元时间)的值显示此结果组合。所以输出应该是这样的:

96000 2856 150309 1 6 1484523745  
3184960 2856 875340 1 1 1484523746  
1179968 2856 309430 1 1 1484523746  
280000 2856 61454 12 1 1484523745  
4864960 2856 5373104 1191 5 1484523745  

在我的 Mac PC 上,使用 datamash 使用单行命令即可轻松完成此操作:

datamash -W --sort -g 2,3 sum 4,5 count 5 first 1 < inputfile

但是,输入文件所在的 Linux 生产服务器没有 datamash,并且安装访问受到限制。 (有数千个输入文件,因此我无法将它们通过 FTP 传输到我的 Mac)。所以我试图用 awk 命令来实现同样的目的。除了打印第一次出现的唯一组合的第 1 列的值之外,我已经实现了所需的结果:

awk -F " " '{a[$2" "$3]+=$4; b[$2" "$3]+=$5; c[$2" "$3]++} END{for(i in a)print i, a[i], b[i], c[i]}' inputfile

使用awk,如何存储第 2 列和第 3 列的每个唯一组合第一次出现时的第 1 列值?

答案1

您可以测试数组中是否存在某个键,并且仅在不存在时更新:

{
    if (! ($2" "$3 in x))
        x[$2" "$3] = $1;
    a[$2" "$3]+=$4;
    b[$2" "$3]+=$5;
    c[$2" "$3]++
}
END {
    for (i in a)
        print i, a[i], b[i], c[i], x[i]
}

相关内容