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
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 原理的进一步探讨

你可能感兴趣的:(BSD 第七章 Unix 数据工具)