You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bash中基于两列统计唯一值的数量?

解决方案:按第一列分组统计第二列唯一值数量

要实现你的需求——按第一列分组,统计对应第二列的唯一值数量(自动忽略重复的行对),可以用以下几种高效的单管道命令方案:

方法1:Awk一步到位推荐

awk -F$'\t' '!seen[$0]++ {count[$1]++} END {for (k in count) print k, count[k]}' file.tsv

命令解释:

  • -F$'\t':指定分隔符为制表符适配TSV文件,如果你实际文件是空格分隔,可以改成-F' ';
  • !seen[$0]++:用数组seen记录所有出现过的完整行,仅当该行是第一次出现时执行后续操作;
  • count[$1]++:针对第一次出现的行,给对应第一列的计数加1;
  • END块:遍历计数数组,输出每个分组的名称和对应的唯一值数量。

方法2:Sort+Uniq+Awk组合

如果更习惯用基础工具组合,也可以这样写:

cut -d$'\t' -f1,2 file.tsv | sort -u | awk '{count[$1]++} END {for (k in count) print k, count[k]}'

命令解释:

  1. cut提取前两列数据;
  2. sort -u直接去掉所有重复的行对;
  3. Awk遍历去重后的行,按第一列分组计数并输出结果。

为什么你之前的命令不生效?

  • 你尝试的第一个命令awk -F " "'{print $1}' file.tsv | uniq -c:只是统计第一列每个值的总出现次数,完全没考虑第二列的重复情况,所以会得到A出现4次,不是你要的3次;
  • 第二个命令cut -d' ' -f1,2 file.tsv | sort | uniq -ci:是统计每个行对的重复次数,输出的是类似2 A 1234这样的结果,而不是按第一列分组后的唯一值数量。

内容的提问来源于stack exchange,提问作者ta4le

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 08:57:49