7.1 Unix 數(shù)據(jù)工具和單行程式方法:從程序 Pearls 中得到的經(jīng)驗(yàn)教訓(xùn)
- 用管道符連接起數(shù)據(jù)工具(構(gòu)建 tiny program):語法分析,各種操作,數(shù)據(jù)概覽
- 舉例:
1986年,按照計(jì)數(shù)打印給定文件中最高頻的k個(gè)單詞(計(jì)數(shù),排序,打?。?/p>
# Malcolm Douglas McIlroy (doug mcilroy): 貝爾實(shí)驗(yàn)室工程師,參與包括Unix與Plan 9的開發(fā),開發(fā)管道符、diff
cat input.txt | tr -cs A-Za-z '\n' | tr A-Z a-z | sort | uniq -c | sort -rn | sed 10q
# Donald Knuth 用Pearls 寫了7頁長的腳本解決該問題
7.2 什么時(shí)候使用 Unix Pipeline 方法 和 怎樣安全的使用它
累積經(jīng)驗(yàn)以根據(jù)目的選擇不同工具:
用one-liner / shell script
用Python腳本
用R腳本
做好記錄!
7.3 使用 Unix 工具查看和操作文本數(shù)據(jù)
- 三種常見文件類型:列之間的分隔符不同
- tab-delimited
- escape code (轉(zhuǎn)義碼): \t
- 文件類型:BED、GTF/GFF、SAM、VCF、tabular BLAST output
- comma-separated
- 逗號
- CSV
- variable space-delimited (處理難度最大的)
- 空格
- tab-delimited
- 行的分隔
- Linux/Unix
- \n
- a single linefees character (換行符)
- Windoes
- \r\n
- a DOS-style line separator of a carriage return and a linefeed character
- CSV
- Linux/Unix
本章目標(biāo):培養(yǎng)自如地使用Unix工具處理純文本數(shù)據(jù)、流的技能
本章示例數(shù)據(jù):BED 、GTF 文件,存儲了基因、外顯子和變異的位置
7.3.1 使用 head 和tail查看數(shù)據(jù)
$ less -S file # 在屏幕上查看文件
-SN file # 在屏幕上查看文件,且顯示行數(shù)
$ head -n 3 # 查看前三行
$ tail -n 3 # 查看最后三行
-n +3 # 從第三行查看開始
$ (head -n 2; tail -n 2) < Mus_musculus.GRCm38.75_chr1.gtf # 查看前兩行 和 后兩行
# 可以在 ~/.bashrc 或者 ~/.profile 下添加 i() {(head -n 2; tail -n 2) < "$1" | column -t}
$ i Mus_musculus.GRCm38.75_chr1.bed
# 常用管道連用模式
$ grep "some_string" huge_file.txt | program1 | program2 | head -n 5
7.3.2 less
less is more,查看輸出,用于1. debug寫好的命令行pipelines;2. 檢查報(bào)錯(cuò)的數(shù)據(jù)。
常用組合: step1 input.txt | step2 | step3 | less
# less 之后,對顯示的數(shù)據(jù)進(jìn)行查看的操作
b 下一頁
g 上一頁
G 最后一行
j 下移(一次一行地)
k 上移(一次一行地)
/<pattern> 自下而上地搜索 pattern (先按\,再輸入pattern)
?<pattern> 自下而上地搜索 pattern
n 重復(fù)上一次的搜索(降序:最后一次搜索--> 第一次搜索)
N 重復(fù)上一次的搜索(升序:第一次搜索-->最后一次搜索)
q 退出less
h 查看幫助文檔
7.3.3 使用wc, ls, awk查看純文本數(shù)據(jù)的概要信息
$ wc file1.txt file2.txt # wc后可以跟多個(gè)文件,顯示每個(gè)文件的word數(shù)目、行數(shù)、character數(shù)目
$ wc -l file.txt # 只顯示文件的總行數(shù),包含為空的行數(shù)
$ grep -v "^#" file.gtf | wc -l # 查看注釋文件有多少行,即以 # 開頭的行有多少
$ grep -c "[^ \\n\\t]" file.txt # 顯示非空的總行數(shù)
$ ls -lh # 以G為單位顯示文件大小
$ awk -F "\t" '{print NF; exit}' file.txt # 顯示文件的列數(shù)(fields of a file)
7.3.4 使用cut處理數(shù)據(jù)的列(field = column)
# cut 與 column 命令的默認(rèn)制表符是 tab,其他類型文件需要對應(yīng)的參數(shù)
$ cut -f 2 file.bed # 提取以tab為制表符的文件中的第二列,
# 其他列提取方式:-f3-8 -f3,5,8
$ cut -d, -f 2 file.csv # 提取以逗號 “,” 為制表符的文件中的第二列
7.3.5 使用column格式化表格數(shù)據(jù)
$ column -t # 把數(shù)據(jù)當(dāng)作表格對待,方便人查看數(shù)據(jù)
$ grep -v "^#" file.gtf | cut -f1-8 | column -t
$ grep -v "^#" file.csv | cut -f1-8 | column -s"," -t
7.3.6 全能的 Grep
速度快但耗費(fèi)資源多
兩參數(shù)
- pattern:string / BRE
- file: 可以是多個(gè)文件
# 舉例 Mus_musculus.GRCm38.75_chr1_genes.txt 文件包含 1號染色體上所有編碼蛋白的基因的 Ensembl gene ID 和 基因名
# 使用的pattern是 字符串(基因名)
$ grep "Olfr418-ps1" Mus_musculus.GRCm38.75_chr1_genes.txt
# 沒有雙引號時(shí),完全匹配和部分匹配都會作為檢索結(jié)果輸出
$ grep Olfr Mus_musculus.GRCm38.75_chr1_genes.txt
# 在結(jié)果中高亮顯示
$ grep Olfr --color=auto Mus_musculus.GRCm38.75_chr1_genes.txt