生信單行命令的美,慢慢體會(三)

劉小澤寫于19.3.9
終于搞完了預答辯,想想昨晚熬夜到四點做完了PPT,真是不容易啊,推送繼續(xù)來,未來的時間會越來越充裕,我也期待繼續(xù)和大家一起學習??

今天繼續(xù)挑一些我個人認為比較重要的單行命令,記錄下來

循環(huán)少不了

尤其是在處理多條染色體的時候,比如人類1-22條常染色體+X、Y、M染色體

有幾個注意的問題:

# 只處理數(shù)字的話,例如只處理常染色體
for i in {1..22};do echo $i;done
# 如果再加上其他非數(shù)字,例如這樣
for i in {1..22,X,Y,M};do echo $i;done
# 得到的結果是不對的,并不是輸出1-22以及XYM,而是輸出
1..22
X
Y
M
# 如果想同時得到數(shù)字和非數(shù)字輸出,要把非數(shù)字內(nèi)容放大括號外邊,并且空格分隔
for i in {1..22} X Y M;do echo $i;done
# 如果想逆序輸出,就在大括號中先寫大數(shù),后寫小數(shù),例如
for i in {5..2} X Y M;do echo $i;done
5
4
3
2
X
Y
M

用cut提取列

我們都知道的用法是:

# 提取1-5以及10-15列(注意中間的逗號)
cut -f1-5,10-15 data
# 還可以指定分隔符(默認tab分隔)
cut -d' ' -f1-5 data

另外,如果想從第5列輸出到最后一列,其實我們不需要知道一共有多少列,直接這樣:

cut -f5- data
# 注意5后面的-就是表示一直到最后一列

這樣普通的用法cut還是很方便的,但是相比awk,cut還是略顯簡陋,因為不支持自定義列,例如:

# 先提取第5列,然后提取第2列(注意如果操作gtf文件,需要看看有沒有頭注釋信息,有的話需要先去掉)
cat gencode.v28.gtf | grep -v "#" | awk '{print $5"\t"$2}' | head
# 但是用cut就不能實現(xiàn)
cat gencode.v28.gtf | grep -v "#" | cut -f5,2 | head
# 得到的結果還是按照先第2列后第5列排序

多學點awk

假設現(xiàn)在有一個test.txt文件,其中包含了1-22條染色體的基因信息。其中第一列是基因名,第2列是染色體編號。

我們現(xiàn)在想按照test.txt中不同染色體的信息區(qū)分開,1號染色體基因信息存放到chr1.txt中,2號染色體的基因信息存放到chr2.txt中...

可能一開始我們想這么做

for i in {1..22};do awk '$2 == $i' test.txt >chr$i.txt;done

但是要知道awk和shell是不融合的,awk中并不知道在shell中定義的$i

因此我們指定尋找$2 == $i,awk不清楚要找什么,但事實上,我們就是想讓awk去根據(jù)在shell中設定的變量去引用,只需要加一個參數(shù)-v

for i in {1..22};do awk -v i=$i '$2 == i' test.txt >chr$i.txt;done

-v的作用就是在awk中引入變量variable

例如還有:

# 自定義過濾指標(例如要求第四列值大于10)
for i in {1..22}; do awk -v i=$i -v threshold=10 '$2 == i && $4 > threshold' test.txt > chr$i.txt; done

今天時間有限,先發(fā)這些吧


歡迎關注我們的公眾號~_~  
我們是兩個農(nóng)轉(zhuǎn)生信的小碩,打造生信星球,想讓它成為一個不拽術語、通俗易懂的生信知識平臺。需要幫助或提出意見請后臺留言或發(fā)送郵件到Bioplanet520@outlook.com

Welcome to our bioinfoplanet!

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容