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 中的次数

你可能感兴趣的:(awk 统计第一列出现次数和以第一列进行group by 第二列不重复的数量)