如何从FASTQ文件中提取唯一read ID并输出到文本文件?
FASTQ文件提取唯一read ID实现方案
FASTQ格式中每条read固定占4行,其中第一行是以@开头的read ID行,提取对应字段后即可复用你处理BAM时用到的sort | uniq去重逻辑,以下是两种常用实现方式:
方案1:基础Linux命令实现(无需安装额外工具)
和你原有BAM处理命令的逻辑完全对齐,适合不想额外装工具的场景:
- 处理未压缩的FASTQ文件:
awk 'NR%4==1{print substr($1,2)}' input.fastq | sort | uniq >> unique.reads.txt
命令逻辑:awk匹配每4行的第1行(即ID行),截取第一个字段从第2位开始的内容(去掉开头的@符号),输出纯read ID后接排序、去重步骤,最终追加写入结果文件。
- 处理gzip压缩的FASTQ文件(后缀为
.fastq.gz,日常分析最常见格式),无需提前解压:
zcat input.fastq.gz | awk 'NR%4==1{print substr($1,2)}' | sort | uniq >> unique.reads.txt
小提示:如果不需要保留ID的排序逻辑,可将
sort | uniq替换为sort -u,运行效率会有小幅提升,你之前使用的BAM处理命令也可以用这个写法优化。
方案2:使用seqkit实现(适合超大体积FASTQ文件)
seqkit是常用的高通量序列处理工具,对大文件的处理效率远高于基础文本命令,且原生支持压缩格式输入,命令更简洁:
- 单端、压缩/未压缩FASTQ都可以用统一格式调用:
seqkit seq -n -i input.fastq.gz | sort | uniq >> unique.reads.txt
参数说明:-n表示仅输出read名称行,-i表示仅输出纯read ID(自动去掉开头的@和ID后的描述信息),输出后直接接排序去重步骤即可。
补充说明
- 如果是双端测序文件需要提取所有read的唯一ID,不需要额外合并步骤:基础命令方案直接把两个压缩文件传给
zcat即可,seqkit方案直接把两个文件路径作为传入参数即可,示例命令如下:
# 基础命令处理双端压缩FASTQ zcat input_R1.fastq.gz input_R2.fastq.gz | awk 'NR%4==1{print substr($1,2)}' | sort -u >> unique.reads.txt # seqkit处理双端压缩FASTQ seqkit seq -n -i input_R1.fastq.gz input_R2.fastq.gz | sort -u >> unique.reads.txt
- 上述命令输出的结果和你之前用samtools处理BAM得到的read ID格式完全一致,可以直接用于后续的ID匹配、序列子集提取等分析。
内容的提问来源于stack exchange,提问作者HimalayanGuy
相关产品推荐
相关产品推荐

