如何在Bash中按ID统计对应列的唯一值数量?
问题:统计每个ID对应的第二列唯一值数量
输入文件file.txt内容如下:
ABC123 111111 ABC123 111111 ABCDEF 333333 ABCDEF 111111 CCCCCC 333333 ABC123 222222 DEF123 444444 DEF123 444444
需求:统计每个相同ID对应的第二列中唯一值的数量,期望输出格式为:
ABCDEF 2 ABC123 2 DEF123 1 CCCCCC 1
当前尝试的命令只能统计第一列的唯一值:
cut -d " " -f1 "file.txt" | uniq -cd | sort -nr | head
解决方案
方法1:使用awk实现(推荐)
通过awk的二维数组直接记录每个ID对应的唯一值集合,最后统计数量:
awk '{ seen[$1][$2] } END { for (id in seen) print id, length(seen[id]) }' file.txt | sort -k2nr
- 原理:二维数组
seen[$1][$2]会自动为每个ID去重存储对应的第二列值; END块遍历所有ID,输出ID和对应唯一值的数量;- 末尾的
sort -k2nr让结果按第二列数值降序排列,和示例输出一致。
方法2:结合sort、uniq、awk实现
先对每行的ID+值组合去重,再统计每个ID的出现次数:
sort -u file.txt | awk '{ count[$1]++ } END { for (id in count) print id, count[id] }' | sort -k2nr
sort -u file.txt:保留所有ID+值的唯一组合;awk统计去重后每个ID的出现次数,即为该ID对应的第二列唯一值数量;- 同样用
sort -k2nr完成降序排序。
内容的提问来源于stack exchange,提问作者Hashim Aziz
相关产品推荐
相关产品推荐

