awk 统计第一列出现次数和以第一列进行group by 第二列不重复的数量

[root@test tmp]# cat /tmp/ns.log 
a 1
a 3
b 2
c 1
[root@test tmp]# awk '{appear[$1]++;if(all[$2] != 1) {all[$2]=1;sum[$1]++}else{sum[$1] = 0}}END{ for (i in appear) {print i, appear[i], sum[i]} }' /tmp/ns.log 
a 2 2
b 1 1
c 1 0

解析

要统计 ns.log 文件中 第一列出现的次数,第二列中按照第一列分组在整列中没有重复的次数。
以 ns.log 为例。
a 出现 2 次。a 后的 1、3 在整个第二列中没有重复,那么没有重复数据就是 2 个。
b 出现 1 次。b 后的 2 在整个第二列中也没用重复,那么没有重复的数据就是 1 个。
c 出现 1 次。 c 后的 1 已经出现过了。那么没有重复的数据就是 0

所以与其结果为

a 2 2
b 1 1
c 1 0

上代码

awk '{appear[$1]++;if(all[$2] != 1) {all[$2]=1;sum[$1]++}else{sum[$1] = 0}}END{ for (i in appear) {print i, appear[i], sum[i]} }' /tmp/ns.log 

appear 记录第一列元素出现的次数
all 第二列元素做 key-value 记录
sum 记录第一列元素对应的第二列元素没有出现在 all 中的次数

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容