《Bioinformatics-Data-Skills》之Unix工具查看与操作文本数据(1)
表格形式的纯文本数据一般通过以下形式记录数据:
- 有一个表头;
- 每一行记录一个观测条目(例如一个病人);
- 每一列记录一个特征维度(例如身高,体重等),使用tab,逗号或者空格分隔。
注:
由于换行符在Unix系统中为换行符"\n",在windows系统中是回车符加换行符”\r\n“,注意可能会出现的问题。
使用tab与逗号分隔的文件分别叫做tsv与csv文件,tsv由于歧义小最常用。
这里我们初步学习如何使用Unix命令查看文本内容。
1. head和tail命令
head
命令会展示文件前10行的内容:
head Mus_musculus.GRCm38.75_chr1.bed
# 1 3054233 3054733
# 1 3054233 3054733
# 1 3054233 3054733
# 1 3102016 3102125
# 1 3102016 3102125
# 1 3102016 3102125
# 1 3205901 3671498
# 1 3205901 3216344
# 1 3213609 3216344
# 1 3205901 3207317
这里的行数可以通过-n
参数指定:
head -n 3 Mus_musculus.GRCm38.75_chr1.bed
# 1 3054233 3054733
# 1 3054233 3054733
# 1 3054233 3054733
tail
的命令展示文件最后几行内容,使用方式与head类似:
tail -n 3 Mus_musculus.GRCm38.75_chr1.bed
# 1 195240910 195241007
# 1 195240910 195241007
# 1 195240910 195241007
不过tail
的-n
参数还可以设定为+x
形式(代表从第x行开始展示),例如:
seq 4 > test.txt
tail -n +2 test.txt
# 2
# 3
# 4
结合head
与tail
命令展示文件的前3行与最后3行:
(head -n 3; tail -n 3) < Mus_musculus.GRCm38.75_chr1.bed
# 1 3054233 3054733
# 1 3054233 3054733
# 1 3054233 3054733
# 1 195240910 195241007
# 1 195240910 195241007
# 1 195240910 195241007
我们可以在~/.bashrc
文件存入以下函数,source
之后可以使用i
(inspect)命令查看文件前3行与最后3行内容:
i(){
(head -n 3; tail -n 3) < "$1" | column -t
}
i Mus_musculus.GRCm38.75_chr1.bed
# 1 3054233 3054733
# 1 3054233 3054733
# 1 3054233 3054733
# 1 195240910 195241007
# 1 195240910 195241007
# 1 195240910 195241007
最后补充一下head
在调试程序中的好处,观察下面的例子:
grep 'gene_id "ENSMUSG00000025907"' | head -n 1
# 1 protein_coding gene 6206197 6276648 gene_id "ENSMUSG00000025907"; gene_name "Rb1cc1"; [...]
由于在最后加入了一个head -n 1
的命令,在grep匹配到1个结果的时候程序就会停止(类似于使用ctrl + c
打断)。
那么我们在测序pipeline的时候可以采用下面的形式:
grep "some_string" huge_file.txt | program1 | program2 | head -n 5
上面的程序在得到5行结果后grep
,program1
,program2
都会停止运行,这样可以方便我们快速地检查与调试代码。
2. less
less
相比于命令更像是应用程序,它可以将结果直接展示在一面屏幕上:
less Mus_musculus.GRCm38.75_chr1.gtf
使用以下的操作方式浏览内容:
空格键
向下一个屏幕,b键
向上一个屏幕,j键
k键
分别向下与向上一行内容,q键
退出(详见表1)。
在less
界面下可以使用/
键搜索文本内容,例如输入/gene_id "ENSMUSG00000025907"
得到高亮的匹配结果(篇幅有限,不展示)。
与head
类似,less
的一个妙用是可以用于debug程序。例如说我们想要构建如下的一个pipeline:
program1 input.txt | program2 | program3 > output.txt
可以通过以下迭代的方式逐步检查与完善此pipeline:
program1 input.txt | less
program1 input.txt | program2 | less
...
最后使用less
的原因是当程序生成的内容达到一个屏幕时,此pipeline会自动停止运行并展示结果,这样我们可以在不用担心计算耗能的情况下进行程序的debug。