bioawk是李恒開發(fā)的基于linux awk的一個(gè)擴(kuò)展工具。用過awk的都知道,它是一款逐行處理文本的古老編程語言,將文本按行讀進(jìn)來,把每一列映射到一個(gè)數(shù)字類型的變量,方便處理。awk中有不少變量,比如:
$0:指當(dāng)前整行文本,$1 、$2分別指第一列和第二列
NR:number of record,就是行數(shù),對(duì)應(yīng)到全稱方便理解記憶
ORS:output record separator,輸出記錄的分隔符,比如是以逗號(hào)還是制表符(\t)分割
好了,有關(guān)awk的更多用法,就說到這里,有興趣可以看左耳朵耗子的博客。下面繼續(xù)說bioawk,它的作者相信有所涉獵生物信息的同學(xué)已經(jīng)聽過了,如果你不知道的話,那么只需告訴你,他同時(shí)還是BWA和SAMtools的作者就行了。
安裝
which bison #如果看到bison是安裝好了的,跳過下面一步apt-get install bison #如果還沒安裝bison,這里是以u(píng)buntu為例的安裝命令git clonehttps://github.com/lh3/bioawk#從github克隆一份源碼安裝
使用
我們先上例子,再講用法
bioawk-cfastx'END {print NR}'test.fastq
>10000#輸出reads條數(shù)
?
wc-ltest.fastq
>40000test.fastq#由于fastq格式是4行為一個(gè)記錄,和上面的結(jié)果是一致的。這太簡單了,一個(gè)`wc`也能搞定呀,干嘛要用bioawk?別著急,后面還有更猛的。
?
bioawk-cfastx'{print $name, length($seq)}'test-trimmed.fastq#將reads名和長度,分為兩列顯示,以制表符分割,以下僅顯示部分結(jié)果
> SOLEXA2_0414:3:1:11146:1065#0/1-contaminated-19 77
> SOLEXA2_0414:3:1:12658:1069#0/1-contaminated-10 85
> SOLEXA2_0414:3:1:17191:1069#0/1-uncontaminated? 85
......
?
#哦,有點(diǎn)意思哈,下面還有,幾乎所有習(xí)慣用awk做的那些篩選統(tǒng)計(jì),這貨都盡量滿足你 :-)
bioawk-cfastx'BEGIN {short=0} {if(length($seq) < 70) short +=1} END {print "short seq total:",short}'test-trimmed.fastq#統(tǒng)計(jì)長度小于70nt的reads數(shù)并輸出
> short seq total:406
?
#這時(shí)候你兩眼放光,哇,有了它,平常做些簡單的統(tǒng)計(jì)方便多了,都不用寫冗長的awk或者為了統(tǒng)計(jì)序列的長度,都要用BioPython。不僅如此,bioawk還支持bed/SAM/vcf/gff/fasta,是不是很爽?
samtools view YSD.sorted.bam | bioawk-csam'{if($mapq < 10) {print $qname,$mapq} }'| les#如果mapping quality< 10,打印read name和mapping質(zhì)量值
> E00491:44:H3YK7ALXX:1:2216:26179:69555? 0
> E00491:44:H3YK7ALXX:1:1201:23297:30422? 0
> E00491:44:H3YK7ALXX:1:1107:32512:26027? 0
bioawk的幫助很簡短
usage: bioawk-F fs-c fmt-f progfile | 'prog'-F: 輸入記錄列和列之間的分隔符,和awk相同-c: 支持的格式,前面講過-t: 以制表符分割各列,效果等同于bioawk -F'\t' -v OFS="\t"-f:官方文檔沒有介紹,這個(gè)參數(shù)和awk的參數(shù)意義一樣,從文件讀取source命令-H:處理sam文件時(shí),是否包含header
需注意的是,處理BAM文件時(shí),要先用samtools view打開,而后使用管道接上bioawk,不然直接使用bioawk會(huì)亂碼。
本文同步發(fā)布于知乎和公眾號(hào)JackTalk