如何用grep结合管道从gff文件中提取去重的miRNA基因名称?
问题原因排查
你写的命令失效主要有3个问题:
- 语法逻辑错误:
grep 命令 > file2 | sort这一步将grep的输出全部重定向写入了file2,管道左侧没有任何标准输出流传递给sort命令,后续流程自然无法执行 - 冗余操作:不需要额外创建临时文件存储中间结果,Linux管道可以直接在多个命令间传递输出流,完全可以实现无临时文件的单行命令
- 正则冗余:你写的
(\gene-MIR)里的反斜杠是多余转义,不需要给字母g加转义符
正确单行命令实现
根据你的需求提供两种常用场景的命令:
场景1:仅输出去重后的miRNA名称列表
grep -Eo "gene-MIR[0-9a-zA-Z]*" file.gff | sort | uniq > unique_mirna_list.txt
场景2:输出去重后的miRNA名称+对应在gff中出现的次数
grep -Eo "gene-MIR[0-9a-zA-Z]*" file.gff | sort | uniq -c > mirna_count_list.txt
小提示:如果你的gff文件中miRNA名称包含横杠后缀(如
gene-MIR124-3p),可以将正则修改为"gene-MIR[0-9a-zA-Z-]*"即可完整匹配整个名称。
命令逻辑说明
grep -Eo "gene-MIR[0-9a-zA-Z]*" file.gff:使用扩展正则匹配所有gene-MIR开头的miRNA名称,仅输出匹配到的名称部分sort:将匹配到的所有名称按字典序排序,uniq命令仅能识别相邻的重复行,因此排序是去重的前置必要步骤uniq:去除重复行,加-c参数会在每行开头统计该条目出现的次数- 最后重定向到输出文件保存最终结果
内容的提问来源于stack exchange,提问作者bioinformaticsnewbe
相关产品推荐
相关产品推荐

