如何从BAM文件按基因组区域提取覆盖度≥20的A碱基?
解决方案
关于samtools的局限性
samtools没法直接完成你这两个任务——它能输出碱基覆盖度和reads中的碱基信息,但筛选覆盖度≥20的A碱基、结合基因组区域统计,必须搭配其他工具才能实现。
任务1:提取覆盖度≥20的A碱基数量
用samtools mpileup输出全基因组每个位点的覆盖度和碱基组成,再用awk筛选统计:
samtools mpileup -f reference.fa input.bam | awk '$4 >= 20 { count += gsub(/[Aa]/, "", $5) } END { print count }'
samtools mpileup -f reference.fa input.bam:输出每个基因组位点的详细信息,第4列是该位点的覆盖度,第5列是所有比对到该位点的碱基(大小写区分正负链,这里统一统计A/a)- awk部分:筛选覆盖度≥20的行,统计第5列中A/a的总数量
任务2:按基因组区域统计分布
需要先准备基因组区域注释文件(GTF/GFF格式),再结合bedtools完成:
- 先把任务1中筛选出的高覆盖A碱基位点输出为BED格式:
samtools mpileup -f reference.fa input.bam | awk '$4 >= 20 && ($5 ~ /[Aa]/) { print $1 "\t" ($2-1) "\t" $2 "\tA\t" $4 }' > high_cov_A_sites.bed
- 用bedtools intersect把位点和注释区域关联,再统计各区域的A碱基数量:
bedtools intersect -a high_cov_A_sites.bed -b annotation.gtf -wa -wb | awk '{print $10}' | sort | uniq -c
- 注意:这里假设GTF文件的第10列是区域类型(比如exon、3'UTR等),实际要根据你的注释文件格式调整对应列数;如果是BED格式注释文件,直接调整列索引即可
更高效的替代工具
如果觉得命令行组合太繁琐,可以用deepTools的multiBamSummary结合注释文件快速统计区域覆盖情况,或者用bedtools coverage直接按区域计算覆盖度,但需要额外加碱基筛选的逻辑。
内容的提问来源于stack exchange,提问作者ayesha
相关产品推荐
相关产品推荐

