學生信的那些事兒之十五 - 生信技能樹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命令查看

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容