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
相关产品推荐
相关产品推荐

