BSD 第七章 Unix 數(shù)據(jù)工具

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ù)

  1. 三種常見文件類型:列之間的分隔符不同
    • tab-delimited
      • escape code (轉(zhuǎn)義碼): \t
      • 文件類型:BED、GTF/GFF、SAM、VCF、tabular BLAST output
    • comma-separated
      • 逗號
      • CSV
    • variable space-delimited (處理難度最大的)
      • 空格
  2. 行的分隔
    • Linux/Unix
      • \n
      • a single linefees character (換行符)
    • Windoes
      • \r\n
      • a DOS-style line separator of a carriage return and a linefeed character
      • CSV

本章目標(biāo):培養(yǎng)自如地使用Unix工具處理純文本數(shù)據(jù)、流的技能
本章示例數(shù)據(jù):BED 、GTF 文件,存儲了基因、外顯子和變異的位置

7.3.1 使用 headtail查看數(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 

7.3.7 破譯純文本數(shù)據(jù):hexdump

7.3.8 使用 sort對純文本數(shù)據(jù)進(jìn)行排序

7.3.9 在 Uniq 中找出獨(dú)一無二的值

7.3.10 Join

7.3.11 使用 AWK 進(jìn)行文本加工

7.3.12 Bioawk : 一種處理生物學(xué)格式數(shù)據(jù)的 awk

7.3.13 使用 Sed 進(jìn)行流編輯(stream editing)

7.4 高階 Shell 的訣竅

7.4.1 Subshells

7.4.2 管道命名和進(jìn)程替換

7.5 Unix 原理的進(jìn)一步探討

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

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

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