学生信的那些事儿之十五 - 生信技能树sam和bam格式文件的shell小练习20题

用上一节下载的bowtie2软件中自带的测试数据生成sam和bam文件先:

# 下载bowtie2软件先
wget -c https://sourceforge.net/projects/bowtie-bio/files/bowtie2/2.3.5.1/bowtie2-2.3.5.1-linux-x86_64.zip
unzip bowtie2-2.3.5.1-linux-x86_64.zip
# 找到示例数据
cd bowtie2-2.3.5.1-linux-x86_64/example/reads
# 先生成sam文件,使用bowtie2命令,绝对路径调用,参数什么的DIY吧
/trainee/Jude/practice/bowtie2-2.3.5.1-linux-x86_64/bowtie2 -x /trainee/Jude/practice/bowtie2-2.3.5.1-linux-x86_64/example/index/lambda_virus -1 reads_1.fq -2 reads_2.fq > test.sam
# sam转换成bam
samtools view -bS test.sam > test.bam

一、统计共多少条reads(pair-end reads这里算一条)参与了比对参考基因组

# 这道题的命令很简单,但是在写命令之前花了好长的时间学习sam文件每一列的含义.下面命令的值是20000,因为是双端,所以有10000条pair-end reads参与了比对。
less -SN  test.sam | grep -v  "^@" | wc

二、统计共有多少种比对的类型(即第二列数值有多少种)及其分布

# 就是统计有多少种flag, 取出第二列,排序,然后合并计数
less -SN  test.sam | grep -v  "^@" | awk '{print $2}' | sort | uniq -c

三、筛选出比对失败的reads,看看序列特征

# 先搞明白什么叫作比对失败的reads:第6列 ( CIGAR )为*则表示比对失败,先计数
less -SN  test.sam | grep -v  "^@" | awk '{if($6=="*")print}'| wc

# 再看序列特征, 序列信息在第10例
less -SN  test.sam | grep -v  "^@" | awk '{if($6=="*")print}'| awk '{print$10}' | less -SN

其实这里有个疑问,按说第三列如果为*也表示比对失败(没有比对上),为什么最终的数值不一样呢···

四、比对失败的reads区分成单端失败和双端失败情况,并且拿到序列ID

# 考的是概念不是技术啊啊啊
less test.sam |grep -v '^@'|awk '{if($6 =="*") print$1}'|sort -n |uniq -c |grep -w 1
less test.sam |grep -v '^@'|awk '{if($6 =="*") print$1}'|sort -n |uniq -c |grep -w 2

五、筛选出比对质量值大于30的情况(看第5列)

# 送分题 : 第五列表示比对质量
less test.sam |grep -v '^@'|awk '{if($5 > 30) print}' | less -SN
less test.sam |grep -v '^@'|awk '{if($5 > 30) print}' | wc

六、筛选出比对成功,但是并不是完全匹配的序列

# 第一反应还是看第6列
less test.sam |grep -v '^@'|awk '{if($6!="*") print$6}'| grep [IDNXSHP]

# 纠结了很久,因为总觉得最后的展示结果应该是$10列,毕竟是要看序列嘛。后来一想,单纯看序列看不出来这些突变呃。。。

七、筛选出insert size长度大于1250bppair-end reads

less test.sam | grep -v '^@'| awk '{if($9>1250) print}'| head | less -SN

八、统计参考基因组上面各条染色体的成功比对reads数量

# 成功比对后第3列会显示对应的参考序列信息,无法比对则显示*,所以取出第3列,排序然后计数
less test.sam | grep -v '^@'| cut -f 3 | sort -u | uniq -c

九、筛选出原始fq序列里面有N的比对情况

# 比对情况看第6列,不过首先需要筛选出有N的行
less test.sam | grep -v '^@'| awk '{if($10~N) print$6}' | less

十、筛选出原始fq序列里面有N,但是比对的时候却是完全匹配的情况

# 同上题思路
less test.sam | grep -v '^@'| awk '{if($10~N) print}' | awk '{if($6!~"[IDNXSHP*]") print}' | less -SN

发现卡壳主要是因为不熟悉awk的语法和SAM数据结构,这样的时候千万不要跟自己较劲,去看别人的答案和教程吧,因为不是逻辑推理的问题,而更像是公式,参考别人的,学会了就好。

十一、sam文件里面的头文件行数

# 头文件结构是以@符号打头
less test.sam | grep '^@' | wc

十二、sam文件里每一行的tags个数一样吗

# 搞清楚tags是啥,在什么地方先:在第12列及后面的列,为可选字段(optional fields),格式如:TAG:TYPE:VALUE,其中TAG有两个大写字母组成,每个TAG代表一类信息,每一行一个TAG只能出现一次,TYPE表示TAG对应值的类型,可以是字符串、整数、字节、数组等。

less test.sam | grep -v '^@' | cut -f 12- | less -SN

# 肉眼可见的不一样

十三、sam文件里每一行的tags个数分别是多少个

# 跟上题一样, 由输出结果可知绝大部分为9个,也有2个,8个的
less test.sam | grep -v '^@' | cut -f 12- | awk -F '\t' '{print "columns:" NF }'

这道题做出来很开心,因为目前能搜到的其他人写的答案这道题都是空着的,哈哈哈~~

十四、sam文件里记录的参考基因组染色体长度分别是?

# 参考基因组染色体的长度信息记录在哪里?
less test.sam | grep '^@' | grep LN

十五、找到比对情况有insertion情况的

# 有insertion表示第6列里面有I
less test.sam | grep -v '^@'| cut -f 6 | grep I 

十六、找到比对情况有deletion情况的

# 有deletion表示第6列里面有D
less test.sam | grep -v '^@'| cut -f 6 | grep D

十七、取出位于参考基因组某区域的比对记录,比如 5013到50130 区域

# 比对区域看第4列,表示比对的起始位置
less test.sam | grep -v '^@'| awk '{if($4>5013 && $4<50130) print}' | less -SN

十八、把sam文件按照染色体以及起始坐标排序

# 就看sort怎么用,首先以染色体排序:
 less test.sam | grep -v '^@' | sort -k 3 | less -S
 
# 以其实坐标排序,坐标是数字,需-n参数
 less test.sam | grep -v '^@' | sort -n -k 4 | less -S

查看结果可知如果按照升序排列的话最前面的都是星号(*),可以改为降序。

十九、找到 102M3D11M 的比对情况,计算其reads片段长度

# grep一下,然后cut或者awk一下
less test.sam | grep "102M3D11M" | cut -f 10 | wc

二十、安装samtools软件后使用samtools软件的各个功能尝试把上述题目重新做一遍

其它概念题

  1. 高通量测序数据分析中,序列与参考序列的比对后得到的标准文件为什么文件?

SAM文件

  1. sam文件是一种比对后的文件,能直接查看吗?

可以,用cat,less等命令均可查看

  1. Sam/Bam文件分为两部分,一部分以@开头的是什么序列,另一部分是什么序列?

以@开头的是头部区域,记录比对的整体信息;另一部分为主体区,记录详细的比对信息,至少11列

  1. Sam文件除头文件,以什么符号分割文本的,比对部分信息一行是多少列?你能用awk计算列数吗?

分隔符为tab,比对部分的列数必须有的是11列,剩余的列数不一定;用awk计算列数参考第13题答案

  1. Sam/Bam文件的@SQ开头的行是什么?你能生成一个文本,两列,一列是参考基因组染色体/sca id,一列是长度吗?

是参考基因组序列信息

  1. Sam文件的比对位置是从1还是0开始的?

从1开始

  1. 常见CIGAR 字符串各字母代表的意义

“M”表示 match或 mismatch;

“I”表示 insert

“D”表示 deletion

“N”表示 skipped(跳过这段区域)

“S”表示 soft clipping(被剪切的序列存在于序列中)

“H”表示 hard clipping(被剪切的序列不存在于序列中)

“P”表示 padding

“=”表示 match

“X”表示 mismatch(错配,位置是一一对应的)

  1. 比对质量的数字是哪一列?越大比对质量越好还是越小越好?

第五列,越大越好,60最好

  1. Sam文件的flag是第几列,数字代表什么意义?是怎么计算来的?

第二列,代表比对的情况,具体计算看表吧

  1. Sam文件怎么转bam文件?用什么指令?为什么要转换?

命令参考samtools view -bS test.sam > test.bam;Bam文件相对于Sam文件进一步压缩,同样的空间可以储存更多数据

  1. Bam文件查看用什么指令?如果需要查看头文件需要增加参数?

指令: samtools view; 查看头文件指令:samtools view test.bam | grep "^@"

  1. Bam文件为什么要排序?排序后的bam和未排序的bam头文件和chr position列有什么区别?

这个不是很确定···

  1. Bam文件建索引的指令是什么?

samtools index test.bam test.bam.bai

  1. Bam文件可视化用什么工具?查看时需要建立索引吗?

可视化可以用IGV吧

  1. Bam文件统计reads比对情况用samtools的哪一个子命令?

samtools tview

  1. SE测序和PE测序的所比对后得到的sam文件的区别在哪里?

根据对SAM文件格式的理解,Flag值会不一样;其他的不太确定···

  1. Bam能用gzip再压缩吗?

not sure about this

  1. Sam文件通常由哪些比对软件得到的?

Bowtie2啊,Hisat啊什么的

  1. Sam/Bam文件能转成fastq文件吗?

当然可以

  1. 有时候不能通过文件名的后缀来区别是sam还是bam,你是怎么区别的?

Sam文件可以直接用cat,less命令查看,Bam为二进制文件,需要用samtools view命令查看

你可能感兴趣的:(学生信的那些事儿之十五 - 生信技能树sam和bam格式文件的shell小练习20题)