這里簡要地整理下Linux用來處理數據文本的工具。具體命令詳情請在Linux命令大全中搜索或者查閱其他相關資料。
head
,tail
查看文檔頭尾。-n
選項可以指定行數。
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
命令默認依次輸出單詞數、行數、總字符數。查看行數使用wc -l
。
如果存在空行,空行會被計數。可以使用grep
命令實現非空行計數
grep -c "[^ \\n\\t]" some_data.bed
ls -lh
以易讀形式查看文件大小。
輸出文件列數:
# -F指定分隔符,此處假定是table鍵分隔,默認空格鍵
awk -F "\t" '{print NF; exit}' some_data.bed
怎么去除注釋的元數據行呢?怎么計數非注釋行行數呢?
可以使用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
發現還有一行沒去掉
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
命令即可計算行數。
上面方法魯棒性不夠(人為的確定行數),一種更為通用的方法是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
可以處理列數據,-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
選項對匹配的行計數;-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"
發現冗余項非常多,如果我們只要唯一的呢,怎么辦?
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
雖然我的筆記本呼啦啦作響,但是還是非常快就跑完了。
后面內容還不少,分兩次講吧~