9. 《Bioinformatics Data Skills》之
2021-05-27 本文已影响0人
DataScience
由于Unix Shell的2大哲学思想模块化与重定向,其成为生物信息学家常用的工作环境。
- 模块化
指的是一个程序只做好一件事情,然后将程序使用管道连接起来。
好处:
- 容易定位错误或BUG
如果使用一大段代码处理完发现最终结果出问题,可能要画很长的时间去找哪里出问题了。模块化之后容易检查是哪一块出问题了。- 容易测试与更换模块
当你觉得一个模块有更好的处理方式时,可以很容易地进行测试与更换。- 可以采用特定的工具或者语言
例如Python擅长比较复杂的处理,R擅长数据分析,整个流程可以在不同的模块采用不同的语言进行针对性的处理。- 可重用
将已经存在的模块进行重新组合可以用来解决新的问题。
- 重定向
好处:
生物信息的文本数据量可以非常大,正常打开会消耗大量的内存与时间。重定向可以在不读取数据到内存的情况下进行处理,可以节省磁盘与内存空间,增加速度。
我们首先来谈一谈重定向的使用方式
标准化输出重定向
cat可以将文件内容传输到标准化输出流,可以将单个文件或者多个文件重定向输出(没有重定向输出的话将打印在屏幕上)
cat tb1-protein.fasta
>teosinte-branched-1 protein
LGVPSVKHMFPFCDSSSPMDLPLYQQLQLSPSSPKTDQSSSFYCYPCSPP
FAAADASFPLSYQIGSAAAADATPPQAVINSPDLPVQALMDHAPAPATEL
GACASGAEGSGASLDRAAAAARKDRHSKICTAGGMRDRRMRLSLDVARKF
FALQDMLGFDKASKTVQWLLNTSKSAIQEIMADDASSECVEDGSSSLSVD
GKHNPAEQLGGGGDQKPKGNCRGEGKKPAKASKAAATPKPPRKSANNAHQ
VPDKETRAKARERARERTKEKHRMRWVKLASAIDVEAAAASVPSDRPSSN
NLSHHSSLSMNMPCAAA
cat tb1-protein.fasta tga1-protein.fasta
>teosinte-branched-1 protein
LGVPSVKHMFPFCDSSSPMDLPLYQQLQLSPSSPKTDQSSSFYCYPCSPP
FAAADASFPLSYQIGSAAAADATPPQAVINSPDLPVQALMDHAPAPATEL
GACASGAEGSGASLDRAAAAARKDRHSKICTAGGMRDRRMRLSLDVARKF
FALQDMLGFDKASKTVQWLLNTSKSAIQEIMADDASSECVEDGSSSLSVD
GKHNPAEQLGGGGDQKPKGNCRGEGKKPAKASKAAATPKPPRKSANNAHQ
VPDKETRAKARERARERTKEKHRMRWVKLASAIDVEAAAASVPSDRPSSN
NLSHHSSLSMNMPCAAA
>teosinte-glume-architecture-1 protein
DSDCALSLLSAPANSSGIDVSRMVRPTEHVPMAQQPVVPGLQFGSASWFP
RPQASTGGSFVPSCPAAVEGEQQLNAVLGPNDSEVSMNYGGMFHVGGGSG
GGEGSSDGGT
可以采用这种方式将多个文件内容合并为单个文件
cat tb1-protein.fasta tga1-protein.fasta > zea-proteins.fasta
ls -lrt
total 40
-rwxr-xr-x 1 way way 152 May 27 15:23 tga1-protein.fasta
-rwxr-xr-x 1 way way 1874 May 27 15:23 tb1.fasta
-rwxr-xr-x 1 way way 353 May 27 15:23 tb1-protein.fasta
-rwxr-xr-x 1 way way 1471 May 27 15:23 resources.md
-rwxr-xr-x 1 way way 28125 May 27 15:23 README.md
-rw-r--r-- 1 way way 505 May 27 16:16 zea-proteins.fasta
注:
- shell的输出重定向符号为
>和>>,前者会覆盖已存在的文件内容而后者会在已存在的内容后面追加。两者都会在文件不存在的情况下创建新文件。 -
ls -lrt的参数说明:l表示以列表形式展示;r表示相反的顺序;t表示时间。将r去掉后最新的文件会出现在列表最上方。
标准化错误输出重定向
我们已经知道如何将标准化的输出重定向到屏幕或文件,而程序的错误,警告或者其它信息会直接显示在屏幕上(Fig.ab)。如果我们也想要记录这些信息作为log文件,该怎么做呢?
Figure 1. Unix输入输出流
答案是采用
2>符号,举例来说,假如我们使用ls展示一个存在和另一个不存在的文件,会同时产生标准化输出与标准化错误输出:
ls tb1-protein.fasta lasjf
# ls: cannot access 'lasjf': No such file or directory
# tb1-protein.fasta
分别对标准化输出与标准化错误进行重定向:
ls tb1-protein.fasta lasjf > listing.txt 2> listing_error.txt
cat listing.txt
# tb1-protein.fasta
cat listing_error.txt
# ls: cannot access 'lasjf': No such file or directory
注:
- 采用
2>的原因是在重定向里面, 0, 1, 2分别代表的是输入,标准化输出与标准化错误,不过很少采用1>作为标准化输出用法。 - 将错误重定向后错误将不会输出在屏幕上面,如果想要在屏幕上追踪的话可以使用
tail -f <log文件>,文件内容增加后会显示出来
标准化输入
linux的标准化输入为<,使用方式:
program < inputfile > outputfile
但是这种方式不直观,并不常用,常用的方式是通过管道:
cat inputfile | program > outputfile