這里簡要地整理下Linux用來處理數(shù)據(jù)文本的工具系瓢。具體命令詳情請在Linux命令大全中搜索或者查閱其他相關資料。
head
,tail
查看文檔頭尾。-n
選項可以指定行數(shù)。
less
用來查閱文檔孙咪,q
退出,space bar
翻頁巡语,g
第一行翎蹈,G
最后一行,j
下男公,k
上,/<pattern>
往下搜索模式荤堪,?<pattern>
往上搜索模式,n
前一個匹配字符,N
后一個匹配字符澄阳。
less
可以用于debug拥知,查看中間輸出結果。比如
step1 input.txt | step2 | step3 > output.txt
# step1,2,3為程序或命令名
可以寫為
step1 input.txt | less
step1 input.txt | step2 | less
step1 input.txt | step2 | step3 | less
純文本信息匯總
wc
命令默認依次輸出單詞數(shù)碎赢、行數(shù)低剔、總字符數(shù)。查看行數(shù)使用wc -l
揩抡。
如果存在空行户侥,空行會被計數(shù)÷袜停可以使用grep
命令實現(xiàn)非空行計數(shù)
grep -c "[^ \\n\\t]" some_data.bed
ls -lh
以易讀形式查看文件大小蕊唐。
輸出文件列數(shù):
# -F指定分隔符,此處假定是table鍵分隔烁设,默認空格鍵
awk -F "\t" '{print NF; exit}' some_data.bed
怎么去除注釋的元數(shù)據(jù)行呢替梨?怎么計數(shù)非注釋行行數(shù)呢?
可以使用tail
結合awk
装黑,試試gtf(基因組注釋文件)
wsx@wsx-ubuntu:~/Work/research/Promoter_Research$ head -n 6 Homo_sapiens.GRCh37.75.gtf
#!genome-build GRCh37.p13
#!genome-version GRCh37
#!genome-date 2009-02
#!genome-build-accession NCBI:GCA_000001405.14
#!genebuild-last-updated 2013-09
1 pseudogene gene 11869 14412 . + . gene_id "ENSG00000223972"; gene_name "DDX11L1"; gene_source "ensembl_havana"; gene_biotype "pseudogene";
可以看到注釋行是5行副瀑,我們利用tail
試試去掉它
# 注意此處 -n后接的"+"號
wsx@wsx-ubuntu:~/Work/research/Promoter_Research$ tail -n +5 Homo_sapiens.GRCh37.75.gtf | head -n 1
#!genebuild-last-updated 2013-09
發(fā)現(xiàn)還有一行沒去掉
wsx@wsx-ubuntu:~/Work/research/Promoter_Research$ tail -n +6 Homo_sapiens.GRCh37.75.gtf | head -n 1
1 pseudogene gene 11869 14412 . + . gene_id "ENSG00000223972"; gene_name "DDX11L1"; gene_source "ensembl_havana"; gene_biotype "pseudogene";
成功搞定,然后結合前面提到的awk
命令即可計算行數(shù)恋谭。
上面方法魯棒性不夠(人為的確定行數(shù))糠睡,一種更為通用的方法是grep
結合awk
命令
wsx@wsx-ubuntu:~/Work/research/Promoter_Research$ grep -v "^#" Homo_sapiens.GRCh37.75.gtf | head -n 1
1 pseudogene gene 11869 14412 . + . gene_id "ENSG00000223972"; gene_name "DDX11L1"; gene_source "ensembl_havana"; gene_biotype "pseudogene";
推薦使用這種。
cut
可以處理列數(shù)據(jù)疚颊,-f
選項指定列狈孔,可以是一個范圍(比如2-8),注意不能用它給列排序材义。
wsx@wsx-ubuntu:~/Work/research/Promoter_Research$ grep -v "^#" Homo_sapiens.GRCh37.75.gtf | head -n 10 | cut -f 3
gene
transcript
exon
exon
exon
transcript
exon
exon
exon
transcript
wsx@wsx-ubuntu:~/Work/research/Promoter_Research$ grep -v "^#" Homo_sapiens.GRCh37.75.gtf | head -n 10 | cut -f 3-5
gene 11869 14412
transcript 11869 14409
exon 11869 12227
exon 12613 12721
exon 13221 14409
transcript 11872 14412
exon 11872 12227
exon 12613 12721
exon 13225 14412
transcript 11874 14409
-d
選項可以指定分隔符均抽,比如-d,
指定,
為分隔符。
使用column
命令來格式化輸出其掂,上次的命令結果輸出明顯沒對齊油挥,我們把它對齊看看:
wsx@wsx-ubuntu:~/Work/research/Promoter_Research$ grep -v "^#" Homo_sapiens.GRCh37.75.gtf | head -n 10 | cut -f 3-5 | column -t
gene 11869 14412
transcript 11869 14409
exon 11869 12227
exon 12613 12721
exon 13221 14409
transcript 11872 14412
exon 11872 12227
exon 12613 12721
exon 13225 14412
transcript 11874 14409
注意,使用這個命令是為了好觀察款熬,不要把用它處理然后把結果傳入文本(會導致程序處理文件效率降低深寥,因為文本解析速度會下降)。
cut
和column
默認以\t
為分隔符贤牛,這里也能夠用-s
選項指定翩迈。
先把之前的tab分隔文件弄成逗號分隔文件,然后使用-s
選項看看:
wsx@wsx-ubuntu:~/Work/research/Promoter_Research$ grep -v "^#" Homo_sapiens.GRCh37.75.gtf | head -n 10 | cut -f 3-5 | awk '{FS="\t";OFS=",";}{print $1,$2,$3}'
gene,11869,14412
transcript,11869,14409
exon,11869,12227
exon,12613,12721
exon,13221,14409
transcript,11872,14412
exon,11872,12227
exon,12613,12721
exon,13225,14412
transcript,11874,14409
wsx@wsx-ubuntu:~/Work/research/Promoter_Research$ grep -v "^#" Homo_sapiens.GRCh37.75.gtf | head -n 10 | cut -f 3-5 | awk '{FS="\t";OFS=",";}{print $1,$2,$3}'| column -s "," -t
gene 11869 14412
transcript 11869 14409
exon 11869 12227
exon 12613 12721
exon 13221 14409
transcript 11872 14412
exon 11872 12227
exon 12613 12721
exon 13225 14412
transcript 11874 14409
grep
處理速度非常之快盔夜,能用它盡量用它。--color=auto
可以激活顏色(標記匹配文字),更方便查看喂链。
-v
選項排除匹配到的返十,-w
進行完全匹配。這樣可以防止椭微,你想排除abc
結果把abc1
洞坑,abcd
也排除掉了。
-B
指定輸出包括匹配到的前多少行蝇率,比如-B1
就是前一行迟杂;-A
指定輸出包括匹配到的后多少行,比如-A2
就是包括了后兩行本慕。-C
指定輸出包括匹配到的前后多少行排拷。
grep
支持基本正則表達式,-E
指定支持擴展表達式锅尘,或者用egrep
命令监氢。
-c
選項對匹配的行計數(shù);-o
選項只抽離輸出匹配的部分
wsx@wsx-ubuntu:~/Work/research/Promoter_Research$ grep -E -o 'gene_id "\w+"' Homo_sapiens.GRCh37.75.gtf | head -n 5
gene_id "ENSG00000223972"
gene_id "ENSG00000223972"
gene_id "ENSG00000223972"
gene_id "ENSG00000223972"
gene_id "ENSG00000223972"
發(fā)現(xiàn)冗余項非常多藤违,如果我們只要唯一的呢浪腐,怎么辦?
wsx@wsx-ubuntu:~/Work/research/Promoter_Research$ grep -E -o 'gene_id "(\w+)"' Homo_sapiens.GRCh37.75.gtf | cut -f2 -d" "| sed 's/"http://g' | sort | uniq | head -n 10
ENSG00000000003
ENSG00000000005
ENSG00000000419
ENSG00000000457
ENSG00000000460
ENSG00000000938
ENSG00000000971
ENSG00000001036
ENSG00000001084
ENSG00000001167
雖然我的筆記本呼啦啦作響顿乒,但是還是非骋榻郑快就跑完了。
后面內容還不少璧榄,分兩次講吧~