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

Bash脚本uniq命令统计重复行异常的排查求助

uniq命令未合并非连续重复行的问题排查与解决

问题背景

统计OTUs/ASVs列表的唯一blast hits数量时,uniq -c偶尔无法合并看似相同的行,已执行dos2unix处理文件,运行环境为Linux,需排查原因并解决。

可复现示例

输入文件check_text.csv:

ASV Genus_Species   Taxid
cb692dc35226a27b1dc4709405077606    Gymnanthemum amygdalinum    82755
cb692dc35226a27b1dc4709405077606    Gymnanthemum amygdalinum    82755
cb692dc35226a27b1dc4709405077606    Gymnanthemum amygdalinum    82755
cb692dc35226a27b1dc4709405077606    Gymnanthemum amygdalinum    82755
cb692dc35226a27b1dc4709405077606    Gymnanthemum amygdalinum    82755
46c5e68b0c1230a4305382e0ddf34c5d    Moscharia solbrigii 460333
46c5e68b0c1230a4305382e0ddf34c5d    Marticorenia foliosa    1910960
46c5e68b0c1230a4305382e0ddf34c5d    Leucheria candidissima  1911693
46c5e68b0c1230a4305382e0ddf34c5d    Moscharia solbrigii 460333
46c5e68b0c1230a4305382e0ddf34c5d    Oxyphyllum ulicinum 540062

执行命令:

dos2unix check_text.csv
dos2unix: converting file check_text.csv to Unix format...

cat check_text.csv | uniq -c > hitcounts.csv

实际输出hitcounts.csv:

1 ASV Genus_Species   Taxid
  5 cb692dc35226a27b1dc4709405077606    Gymnanthemum amygdalinum    82755
  1 46c5e68b0c1230a4305382e0ddf34c5d    Moscharia solbrigii 460333
  1 46c5e68b0c1230a4305382e0ddf34c5d    Marticorenia foliosa    1910960
  1 46c5e68b0c1230a4305382e0ddf34c5d    Leucheria candidissima  1911693
  1 46c5e68b0c1230a4305382e0ddf34c5d    Moscharia solbrigii 460333
  1 46c5e68b0c1230a4305382e0ddf34c5d    Oxyphyllum ulicinum 540062

预期输出:

1 ASV Genus_Species   Taxid
  5 cb692dc35226a27b1dc4709405077606    Gymnanthemum amygdalinum    82755
  2 46c5e68b0c1230a4305382e0ddf34c5d    Moscharia solbrigii 460333
  1 46c5e68b0c1230a4305382e0ddf34c5d    Marticorenia foliosa    1910960
  1 46c5e68b0c1230a4305382e0ddf34c5d    Leucheria candidissima  1911693
  1 46c5e68b0c1230a4305382e0ddf34c5d    Oxyphyllum ulicinum 540062

问题原因

uniq命令的核心特性是仅合并连续的重复行,非连续的相同行不会被自动合并。示例中Moscharia solbrigii的两行被其他行隔开,因此uniq -c会将它们视为独立行统计。

排查与解决方法

1. 核心解决:先排序再去重统计

先通过sort将相同行集中到一起,再用uniq -c统计,同时保留表头:

# 提取表头到结果文件
head -n 1 check_text.csv > hitcounts.csv
# 跳过表头,对内容排序后去重统计,追加到结果文件
tail -n +2 check_text.csv | sort | uniq -c >> hitcounts.csv

2. 额外排查点

  • 验证行内不可见字符:用cat -A check_text.csv查看是否存在制表符、软空格、非打印ASCII字符(如^M已被dos2unix处理,但可能有其他控制字符),这些字符会导致行内容看似相同但实际不同。
  • 指定排序规则:如果文件用制表符分隔字段,可使用sort -t$'\t' -k1,3强制按前3列排序,避免因分隔符不一致导致排序异常。
  • 确认uniq版本:部分环境下uniq可能有参数差异,可执行uniq --version查看,确保使用标准GNU版本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 04:57:14