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 工具查看和操作文本数据
- 三种常见文件类型:列之间的分隔符不同
- tab-delimited
- escape code (转义码): \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
本章目标:培养自如地使用Unix工具处理纯文本数据、流的技能
本章示例数据:BED 、GTF 文件,存储了基因、外显子和变异的位置
7.3.1 使用 head
和tail
查看数据
$ 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