BSD 第七章 Unix 数据工具

7.1 Unix 数据工具和单行程式方法:从程序 Pearls 中得到的经验教训

  • 用管道符连接起数据工具(构建 tiny program):语法分析,各种操作,数据概览
  • 举例:

1986年,按照计数打印给定文件中最高频的k个单词(计数,排序,打印)

# Malcolm Douglas McIlroy (doug mcilroy): 贝尔实验室工程师,参与包括Unix与Plan 9的开发,开发管道符、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 什么时候使用 Unix Pipeline 方法 和 怎样安全的使用它

累积经验以根据目的选择不同工具:

  • 用one-liner / shell script

  • 用Python脚本

  • 用R脚本

  • 做好记录!

7.3 使用 Unix 工具查看和操作文本数据

  1. 三种常见文件类型:列之间的分隔符不同
    • tab-delimited
      • escape code (转义码): \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

本章目标:培养自如地使用Unix工具处理纯文本数据、流的技能
本章示例数据:BED 、GTF 文件,存储了基因、外显子和变异的位置

7.3.1 使用 headtail查看数据

$ less   -S file     # 在屏幕上查看文件
         -SN file   # 在屏幕上查看文件,且显示行数
$ 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. 检查报错的数据。

常用组合: step1 input.txt | step2 | step3 | less

# less 之后,对显示的数据进行查看的操作
b       下一页
g       上一页
G       最后一行
j       下移(一次一行地)
k       上移(一次一行地)
/<pattern>          自下而上地搜索 pattern (先按\,再输入pattern)
?<pattern>      自下而上地搜索 pattern
n       重复上一次的搜索(降序:最后一次搜索--> 第一次搜索)
N       重复上一次的搜索(升序:第一次搜索-->最后一次搜索)
q       退出less
h       查看帮助文档

7.3.3 使用wc, ls, awk查看纯文本数据的概要信息

$ wc file1.txt file2.txt    # wc后可以跟多个文件,显示每个文件的word数目、行数、character数目
$ wc -l file.txt    # 只显示文件的总行数,包含为空的行数
$ grep -v "^#" file.gtf | wc -l # 查看注释文件有多少行,即以 # 开头的行有多少
$ grep -c "[^ \\n\\t]" file.txt # 显示非空的总行数

$ ls -lh        # 以G为单位显示文件大小

$ awk -F "\t" '{print NF; exit}' file.txt   # 显示文件的列数(fields of a file)

7.3.4 使用cut处理数据的列(field = column)

# cut 与 column 命令的默认制表符是 tab,其他类型文件需要对应的参数
$ cut -f 2 file.bed # 提取以tab为制表符的文件中的第二列,
                    # 其他列提取方式:-f3-8 -f3,5,8
$ cut -d, -f 2 file.csv # 提取以逗号 “,” 为制表符的文件中的第二列

7.3.5 使用column格式化表格数据

$ column -t # 把数据当作表格对待,方便人查看数据
$ grep -v "^#" file.gtf | cut -f1-8 | column -t
$ grep -v "^#" file.csv | cut -f1-8 | column -s"," -t

7.3.6 全能的 Grep

速度快但耗费资源多
两参数

  • pattern:string / BRE
  • file: 可以是多个文件
# 举例 Mus_musculus.GRCm38.75_chr1_genes.txt 文件包含 1号染色体上所有编码蛋白的基因的 Ensembl gene ID 和 基因名
# 使用的pattern是 字符串(基因名)
$ grep "Olfr418-ps1" Mus_musculus.GRCm38.75_chr1_genes.txt
# 没有双引号时,完全匹配和部分匹配都会作为检索结果输出
$ grep Olfr Mus_musculus.GRCm38.75_chr1_genes.txt
# 在结果中高亮显示
$ grep Olfr --color=auto Mus_musculus.GRCm38.75_chr1_genes.txt 

7.3.7 破译纯文本数据:hexdump

7.3.8 使用 sort对纯文本数据进行排序

7.3.9 在 Uniq 中找出独一无二的值

7.3.10 Join

7.3.11 使用 AWK 进行文本加工

7.3.12 Bioawk : 一种处理生物学格式数据的 awk

7.3.13 使用 Sed 进行流编辑(stream editing)

7.4 高阶 Shell 的诀窍

7.4.1 Subshells

7.4.2 管道命名和进程替换

7.5 Unix 原理的进一步探讨

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351

推荐阅读更多精彩内容