跳转到内容

下一代测序 (NGS)/生物信息学从外部

来自维基教科书,开放世界中的开放书籍
下一代测序 (NGS)
大数据 生物信息学从外部 预处理

生物信息学从外部

[编辑 | 编辑源代码]
要深入了解 UNIX,请参阅 UNIX 指南UNIX 快速入门

Unix 命令行:历史

[编辑 | 编辑源代码]

第一个版本的 Unix 由贝尔实验室(AT&T 的一部分)于 1969 年开发,距今已有 40 多年的历史。它的起源可以追溯到计算机体积庞大、数量稀少、使用时间非常昂贵并且在许多用户之间共享的时代。Unix 的开发是为了允许多个用户同时工作。Unix 实际上是出于玩一个名为 太空旅行 的游戏的愿望而产生的,而使其成为操作系统的特性则是偶然的。最初,它只支持一个用户,Unix 的名称(最初为 UNICS)是 MULTICS 的一个双关语,MULTICS 是当时可用的一个多用户系统。

虽然这在每个人都有自己笔记本电脑的世界中似乎很奇怪且不必要,但计算正在重新回到远程中央服务,许多用户共享。映射下一代测序数据或从头组装所需的计算能力超出了您笔记本电脑上可用或可取的范围。在许多方面,“云”(或者在你阅读本文时取代它的任何东西)需要以与传统 Unix 机器更相似的​​方式工作,而不是 Windows 和 Apple Macintosh 所强调的个人计算方式。

美国联邦垄断法阻止 AT&T 将 Unix 商业化,但在贝尔实验室以外使用 Unix 的兴趣不断增加,最终他们决定免费提供 Unix,包括源代码,这允许其他机构对其进行修改。也许其中最重要的是伯克利大学。(Mac OS X 的很大一部分根植于伯克利标准发行版(BSD),它分发了工具集以使 Unix 更实用,并进行了重大改进以显着提高性能。)几所大学参与其开发意味着 Unix 在互联网诞生时处于理想位置,并且许多基本技术是在 Unix 机器上开发和测试的。同样,这些改进也是免费提供的。一些代码被重新用于为早期版本的 Windows 提供网络连接,即使在今天,Windows Vista 中的几个实用程序也包含了伯克利代码。

除了在早期互联网的发展中发挥关键作用外,Unix 机器也是第一台网络服务器,一台 NeXT cube。NeXT 是早期尝试将 Unix 机器用于桌面使用的尝试。它在当时非常先进,但也很昂贵,除了金融行业之外,它从未真正流行起来。苹果最终收购了 NeXT,其操作系统变成了 OS X,这种遗产仍然可以在其编程接口中看到。苹果现在是 Unix 机器最大的制造商;每台苹果电脑、iPhone 和大多数最新的 iPod 在其外观之下都拥有一个 Unix 基础。

到 90 年代初,Unix 变得越来越具有商业重要性。这不可避免地导致了法律纠纷:由于这么多人免费赠送改进并将其整合到系统中,那么究竟是谁拥有它?法律纠纷给免费提供的 Unix 版本蒙上了一层阴影,为另一种免费操作系统创造了机会。

这个空白由 Linux 填补,Linux 是由 Linus Torvalds 于 1991 年作为爱好开始的,类似于 Unix 的免费提供的计算机操作系统。更准确地说,Linux 只是内核,它是所有其他程序运行的中心程序。要制作一个操作系统,还需要更多工具。这些工具由 GNU 项目提供。[1]

重要的是,Linux 是从头开始编写的,不包含任何原始的 Unix 代码,因此不存在法律疑虑。与互联网渗透大学校园以及廉价但功能强大的个人电脑的普及相吻合,Linux 在两年内迅速成熟,超过 100 名开发人员通过互联网进行合作。推动 Linux 发展的真正进步是社会性的,而不是技术性的,分散的志愿者在这样的理解下贡献时间:作为回报他们免费提供自己的工作,任何基于他们工作的内容也是免费提供的,因此他们反过来也从改进中受益。

支撑这种共享并确保没有人可以在不共享的情况下从其他人的工作中获利的理念是“版权所有”,这在称为 GNU 通用公共许可证的简单法律文件中有所描述,[2] 它颠覆了版权的概念。(需要注意的是,GNU 项目及其背后的理念早于 Linux 将近十年。)如今,Linux 已成为占主导地位的免费类 Unix 操作系统,拥有数百万用户和许多大型公司的支持。

获取和安装 Ubuntu

[编辑 | 编辑源代码]

这里我们描述 Ubuntu 发行版(打包)的 Linux,它是使用最广泛的发行版之一,但所有示例都相当通用,应该适用于大多数 Linux、Unix 和 Mac OS X 计算机。网上有很多关于如何安装 Ubuntu 的指南,但我们建议您在当前计算机上将其安装为虚拟机。

Ubuntu Linux 发行版通常易于使用,并且每六个月都会更新(免费)。这里使用的示例和版本适用于 Ubuntu 11.10 版本,以 2011 年 10 月的发布日期命名,也称为“Oneiric Ocelot”;下一个(最新的)版本 12.04 或“Precise Pangolin”于 2012 年 4 月发布,被指定为长期支持 (LTS) 版本,这意味着它将在退役之前接受修复和维护升级五年,如果您不想定期升级系统,它是最佳选择。

Ubuntu 经过精心设计,使用起来非常便捷,即使是计算机新手也能够轻松上手。对于刚接触 Ubuntu 的用户,网上有很多教程可以参考。官方文档可以在[3]找到,但只需在网上快速搜索就可以找到更多内容。此外,机器上还安装了许多文档。可以通过将鼠标移动到屏幕左上角的 Ubuntu 桌面,并点击出现的帮助菜单来访问这些文档。一般来说,你正在使用的程序名称会显示在屏幕左上角,将鼠标移动到屏幕顶部会以类似于 Mac 上显示的方式显示程序菜单(虽然令人困惑的是,一些程序将其菜单显示在自己的窗口中,就像 Windows 计算机一样)。

另一种获取帮助的方法是点击屏幕左上角的圆形符号(三个手拉手的人的艺术化图片),并在出现的搜索框中键入“help”。为了便于称呼,我们将“手拉手”按钮称为 Ubuntu 按钮,尽管出现的帮助文本将其描述为“Dash home”。

Ubuntu 附带许多免费工具,包括网页浏览器、文件管理器、文字处理器等。大多数日常使用的软件都有免费的替代品,可以通过点击 Ubuntu 软件中心来浏览它们,该中心的屏幕左侧图标看起来像一个装满了商品的纸购物袋。Ubuntu 软件中心只是一个起点,还有许多其他来源,包括专门为 Ubuntu 打包的预打包软件和需要编译的源代码。在网上搜索“Ubuntu 软件库”以获取有关获取更多软件的更多信息。

虽然与 Windows 或 Mac 一样,Ubuntu 也有一些明确的组合键用于复制和粘贴文本(control-c 和 control-v),但并非所有程序都遵守这一约定。传统上,Unix 更偏向于鼠标操作,使用左键选择文本,使用中键复制文本。如果你不习惯使用鼠标中键,你可能会偶尔意外地这样做。从图标启动应用程序、打开文件夹等... 只需要单击一次,而不是 Windows 所需的双击,这使得按下按钮和从菜单中选择项目的操作更加一致。意外双击通常会导致某个操作执行两次,这通常不是什么坏事,但这意味着性急的用户可能会很快发现他们的桌面被窗口覆盖。

也许你每天都会遇到的最重要的区别是,文件名和目录名是区分大小写的:README.txt、readme.txt 和 readme.TXT 代表不同的文件。这与 Windows 和 Mac OS X 不同,在 Windows 和 Mac OS X 中,大小写字符保留在名称中,但文件可以使用任何大小写来引用。(尽管 OS X 继承了 Unix 的传统,但苹果公司选择这种行为是为了与早期版本的 Mac 操作系统保持兼容)

获取示例

[编辑 | 编辑源代码]

本教程中有很多示例可以尝试,它们包含在类似于以下示例的方框中,这些方框解释了示例的格式。下面的示例展示了如何自动下载并解压缩文件以供使用。

图 1:自动下载并解压缩文件的示例

基础知识

[编辑 | 编辑源代码]
命令行
[编辑 | 编辑源代码]

虽然 Ubuntu 拥有现代操作系统中所有你可能期望的图形工具,因此新用户很少需要处理其 Unix 基础,但我们将使用命令行。一个显而易见的问题是,为什么命令行仍然是与 Unix 交互的主要方式,或者更确切地说,为什么我们要让你使用它?第一个问题的部分答案是,Unix 的起源早于图形界面的发展,这就是所有工具和程序的演变来源。命令行之所以仍然流行,是因为它是与计算机交互的一种非常有效的方式:当你想要做一些足够复杂的事情,而没有一个方便的按钮可以实现时,图形界面会迫使你浏览许多菜单并手动执行一项可以自动化的任务。或者,你必须诉诸某种形式的编程(Mac OS X Automator、Microsoft Office 宏等),这在功能上等同于使用命令行。

Unix 是围绕许多旨在协同工作的微型工具构建的。每个程序都执行一项任务,并以其他程序易于理解的格式返回其输出。这些特性允许将简单的程序组合在一起以产生复杂的结果,就像用乐高积木搭建东西一样。1978 年贝尔系统技术期刊[4]中的前言将 Unix 哲学描述为

"(i) 让每个程序都做好一件事。要完成一项新工作,就要从头开始构建,而不是通过添加新功能来使旧程序变得复杂。

(ii) 预期每个程序的输出将成为另一个程序的输入,而这个程序尚不清楚。不要在输出中加入无关的信息。避免使用严格的列式或二进制输入格式。不要坚持交互式输入。

(iii) 设计和构建软件,即使是操作系统,也要尽早尝试,理想情况下在几周内完成。不要犹豫,将笨拙的部分扔掉并重新构建它们。

(iv) 使用工具而不是非熟练的帮助来减轻编程任务,即使你必须绕道构建工具,并期望在完成使用后将其中一些工具扔掉."

本教程的其余部分将基于通过“终端”使用命令行。这个术语可以追溯到 Unix 的早期,那时会有许多“终端”,基本上是一个简单的屏幕和键盘,连接到中央计算机。可以通过点击 Ubuntu 按钮并在搜索框中键入“terminal”来找到终端程序,如插图 1 所示。你也可以使用键盘轻松访问终端,方法是按下 control-alt-T。打开后,可以使用 View/Zoom 菜单选项更改文本大小,或使用 Edit/Profile Preferences 菜单选项完全更改字体。

虽然我们在研讨会期间使用 Linux,但你以后可能无法访问机器,或者可能不想在你的电脑上独占地使用 Linux。虽然你可以将 Linux 作为你的电脑上的“双启动”来安装,或者在虚拟机中运行它(虚拟机 (VM) 是你电脑上的一款程序,它充当另一台电脑,可以运行其他操作系统。有很多 VM 可用,VirtualBox http://www.virtualbox.org/ 是免费的,并且定期更新),但命令行的知识在不同平台之间具有相当的可移植性。Mac OS X 也隐藏了一个命令行 (/Applications/Utilities/Terminal),并且,除了少数特例之外,在 Linux 命令行上起作用的一切都应该在 OS X 上起作用。Windows 有自己的不兼容的命令行版本,但可以安装 Cygwin http://www.cygwin.com/,它在 Windows 中提供了一个完整的类 Unix 环境。

图 2:在 Ubuntu 中打开终端。桌面的右下角显示了一个部分遮挡的终端

命令行的开头是命令提示符,它表示计算机已准备好接受命令。提示符是 user@computer:directory$ 形式的文本。图 2 中的用户名为 tim,在名为 coffee-grinder 的计算机上的 ~ 目录中。当你同时处理多台远程计算机时,拥有所有这些信息非常方便。提示符是可配置的,并且可能因计算机而异;你可能会注意到,其他提示符略有不同。表 1 中显示了一些基本命令;尝试在命令行中键入这些命令,并在命令后按回车键,告诉计算机运行命令。

图 3:一些回答人生重要问题的基本命令:“我是谁?”,“我在哪里?”,“我运行的是什么操作系统?”
文件和目录
[编辑 | 编辑源代码]

在 Unix 中,所有文件都以树状结构排列:目录表示为从单个树干(“根”)延伸出来的分支,并且依次可以有从它们延伸出来的其他分支(目录内的目录),单个文件是树的叶子。树状结构类似于其他常见操作系统,大多数文件浏览器可以以树状方式显示文件系统,例如:图 4 显示了 Ubuntu Linux 计算机文件系统的一部分。

图 4:Ubuntu 文件系统的树状结构。Home/Tim 目录已打开以显示其内容(说明性目的)

Unix 与其他操作系统的不同之处在于文件系统更多地用于组织不同类型的文件。基本系统程序都位于/bin 中,它们的共享代码(库)位于/lib 中;类似地,用户程序位于/usr/bin 中,库位于/usr/lib 中,手册页位于/usr/share/man 中。

有两种不同的方法可以指定树中文件或目录的位置:绝对路径和相对于我们在文件系统中的当前位置的相对路径(当前工作目录)。绝对路径是从根目录开始的,不依赖于当前工作目录的位置。从表示根目录的 / 开始,绝对路径描述了我们必须遵循的所有目录(分支)才能到达目标文件。每个目录名称之间用 / 分隔。

例如,home/user/Music/TheKinks/SunnyAfternoon.mp3 指的是 TheKinks 目录中的 SunnyAfternoon.mp3 文件,该目录位于 Music 目录中,该目录位于用户的目录中,该目录位于 home 目录中,该目录连接到根目录。如果您熟悉 Microsoft Windows,您可能会注意到路径分隔符不同。基于 Unix 的系统使用正斜杠 (/) 而不是 Windows 上使用的反斜杠 (\)。您可能已经注意到网页的路径也是用正斜杠分隔的,这揭示了它们作为远程机器上文件路径的 Unix 起源。

为了方便起见,一些目录有特殊的符号作为它们的同义词,其中最常见的是在图 5 中列出的。这些符号中的大多数在路径开头时具有特殊含义,否则它们只是一个符号。例如,dir/~/ 是当前目录中 dir 目录内的~ 目录,而~/dir/ 是主目录内的 dir 目录(通常在 Linux 上为 /home/user,在 Mac OS X 上为 /Users/user)。在这两种情况下,'/' 符号都是分隔符,而不是根目录。

图 5:特殊目录名称

可以使用 pwd 命令在命令行显示当前位置,即工作目录。我们可以使用相对于我们所在位置的路径来引用文件,而不是使用其绝对路径:当前目录中的文件可以用其名称来引用,工作目录内的目录中的文件可以用 directory/filename 来引用(以此类推对于工作目录内的目录内的目录内的文件,等等)。请注意,这些路径与我们描述绝对路径的方式非常相似,只是它们不以 / 开头;绝对路径是相对于根目录的相对路径(或者我们可以将初始 / 理解为“转到根目录”,并将它们视为相对路径)。如图 5 所示,当前目录上面的目录可以称为 ..,因此,如果工作目录是 /home/user,那么根目录可以称为 ../..(向上一个目录,然后向上另一个目录)。符号 .. 可以自由地混合到路径中:当前目录下面的示例目录可以具有路径 examples/../examples/../examples(不用说,只使用 examples 是推荐的)。

命令
[edit | edit source]

命令只是计算机上其他地方的程序,在命令行输入它们的名称就会运行它们。命令具有可预测的格式

command -flags target

命令是要运行的程序的名称,(可选)标志修改其行为,目标是命令要操作的内容,通常是文件的名称。许多命令既不需要标志也不需要目标,但 Unix 工具通常非常可配置,即使是简单的命令如 date(有些实用程序也有仿制品,例如参见ddatesl)也有许多可选标志来更改其输出的格式。

如文件和目录中所述,有一些特殊的目录用于存放可执行程序,其中包含的程序可以通过在命令行输入它们的名称来运行。您可以简单地通过键入这些目录中的程序的名称来运行它们的原因是,操作系统知道在这些目录中查找程序。一般来说,您没有权限将文件放置在这些目录中,经验丰富的 Unix 用户会创建自己的目录,通常是~/bin/,用于放置他们经常使用的程序。创建这个目录不会使其变得特殊;您仍然必须告诉操作系统也到那里查找程序。操作系统有一个变量,$PATH,它是一个包含计算机查找程序的目录列表。要将目录添加到该列表中,请使用命令“export PATH=~/bin:$PATH”,其中“~/bin”是要添加的目录。此命令通常添加到文件~/.bashrc 中,该文件是在每次打开新终端时自动运行的命令列表。如果程序不在特殊目录中,您不能只通过键入其名称来运行它,因为计算机不知道在哪里找到它。即使该程序位于当前目录中,也是如此。不在特殊目录中的程序仍然可以运行,但您必须包含其所在位置的路径。如果该程序位于您的当前工作目录中,这可能与键入 ./program(程序位于当前目录中)一样简单。如果该程序位于其他地方,只需键入到该程序所在位置的绝对路径或相对路径即可。您始终可以使用命令行的自动完成功能(见下文的“制表符完成”)来减少所需的键入量。为了避免键入常用程序的路径,最好将其路径添加到PATH 变量中 ~/.bashrc 中。

您很快就会发现,鼠标不会在终端中移动光标。终端界面早于鼠标普及几十年,并且已经开发出在周围移动和编辑的替代方法。大多数常见操作都定义了键盘快捷键,图 6 列出了其中的一些。可能最有用的快捷键是制表键。它可以用于完成文件系统中的命令名称和路径(称为“制表符完成”)。按一次制表键将完成路径,直到遇到第一个歧义为止,再次按制表键将给出可能的完成列表(您可以键入您想要的字母或数字,然后再次按制表键以尝试进一步自动完成)。

图 6:在命令行中移动周围的常用键绑定
图 7:用于操作文件的命令

会记录您输入的命令,可以使用history 命令列出它们,以便您可以参考之前执行的操作。历史记录也可以搜索:Control-r 启动搜索,计算机将在您键入时与您的历史记录匹配;键入 Enter 接受当前行,再次键入 Control-r 转到下一个匹配项,Control-g 取消搜索。历史记录也可以通过使用history 命令列出的条目编号来引用:在命令行中输入 !n 将重复历史记录条目 n,输入 !! 将重复最后一个命令。

有许多命令,通常非常简短,用于操作文件,表 4 列出了其中一些更有用的命令。许多 Unix 命令都有简短的名称,通常只有两三个字母,因此键入错误很容易产生意外且严重的后果!请谨慎输入,因为 Unix 很少给您第二次机会来纠正错误。一些 Unix 机器具有sl 命令来鼓励准确键入。

图 7 显示了一些用于操作文件的命令以及简短的解释。

在 Unix 命令行中,一些符号可能具有特殊含义。斜杠 '/' 表示目录名称的结尾,星号 '*' 是通配符,等等。但是,在许多情况下,符号最好没有特殊含义,最常见的例子是文件名包含空格(空格在某种意义上是一个特殊字符,因为它被解释为命令行选项之间的断点)。可以通过在前面添加一个 '\' 来“转义”有问题的字符以去除其特殊含义,例如:/ 是根目录,但 \/ 是一个名为 '/' 的文件。

以 . 字符开头的文件默认情况下是隐藏的,不会出现在 ls 或等效命令的输出中(或者在使用图形用户界面时不会出现在文件浏览器中)。通常,隐藏文件是计算机或程序直接使用的文件,包含旨在供用户理解或使用的配置信息。

读写权限

[edit | edit source]

所有文件和目录都与一组权限相关联,描述谁被允许读取或写入该文件。有三种基本权限:读取r、写入w 和执行x。读取和写入的含义相当明显,但执行的含义取决于上下文。对于普通文件,执行权限用于具有可执行代码(即程序)的文件,以授予用户运行该程序的权限。对于目录,x 权限允许用户打开该目录并查看它包含的文件。有三种用户类别:所有者u(通常是创建该文件的用户)、组g(所有者所属的用户组)和其他o(所有其他人)。每个文件的权限都用一个九个字符的字符串来描述,每个用户类别三个字符。分配给每个用户类别的三个位置对应于三种类型的权限('r,wx,按此顺序)。如果该用户类别具有给定的权限,则相应的字母将出现。如果没有,该字母将被替换为短划线 '-'。例如,如果用户类别有权读取和执行文件,但无权写入文件,则其三元组将显示为r-x。权限字符串rwxr-x--- 意味着所有者有权读取、写入或执行,同一组中的用户有读取和执行权限,而其他用户没有权限。

文件的拥有者可以更改其权限。如果一些程序正在由文件的拥有者运行,它们将自动执行此操作,这会让人觉得权限已被忽略。运行rm -f 是用户最常遇到这种行为的时候:默认情况下,rm 会提示删除写保护文件(即您没有写权限的文件),但-f(强制)标志告诉它不要打扰询问,直接删除该文件。

处理多个文件

[编辑 | 编辑源代码]

通常,特别是在运行脚本或整理文件时,您需要一次处理多个文件。与其显式地键入每个文件名,我们可以提供一个模式而不是文件名。所有文件名都将针对该模式进行检查,计算机将自动生成所有匹配文件的列表,以便在运行命令时使用。模式是使用具有特殊含义的符号创建的。例如:* 表示匹配任何内容(或无内容),因此 a*b 是一个模式,它匹配以 a 开头并以 b 结尾的任何文件名,包括文件 ab。图 8 包含一个用于构建模式的有用特殊符号列表。

图 8:文件名的特殊符号。与表中的 \* 示例一样,可以通过使用“转义”字符“\”来防止这些符号中的任何一个具有特殊含义。

如上所述,模式匹配在命令运行之前发生,并且模式将被匹配结果替换。该命令永远不会看到模式,只会看到匹配的结果。

运行多个程序

[编辑 | 编辑源代码]

从早期开始,Unix 就被设计为在远程机器上同时运行多个程序,并且对该功能的支持已集成到命令行中。作业(脚本、程序或其他从命令行运行的相当自包含的事物)可以根据它们对终端的影响分为两种类型,前台作业和后台作业。前台作业临时替换命令行,您无法在它完成之前输入新命令,而后台作业独立运行并允许您继续执行其他任务。只有前台作业接收来自键盘的输入,因此像 PAUP* 这样的交互式程序应该作为前台运行(尽管您可以设置一个计算密集型分析,将其置于后台并继续执行其他任务,同时它正在运行。之后,当计算完成时,该程序可以再次变为前台,以便可以继续交互)。尽管后台作业让您的命令行大部分可以自由地做其他事情,但它们确实将它们的输出发送到您从中启动它们的终端,因此您可能会看到它在另一个任务的中间弹出,这可能会令人困惑。如果您运行多个后台作业,它们的输出将根据它产生的时间交织在一起,没有任何指示哪个程序产生了输出。


图 9:一些用于作业控制的命令和组合键

正如图 9 中所暗示的那样,作业和进程之间存在区别。一个进程是机器上运行的单个程序,并且每个进程都用 pid(进程 ID)唯一编号。您可以使用 ps 列出您正在运行的所有进程,包括命令行本身(通常称为 bash,但在某些 unix 发行版中它可能是 zsh 或 tcsh)。命令行本身只是一个在计算机上运行的进程(程序),尽管它专门设计用于启动、停止和操作其他进程。进程是跟踪计算机上正在运行的程序的基本方法。另一方面,作业是在命令行上输入的,其中许多包括多个程序,通过管道(见 输入、输出和管道)逻辑地连接在一起以完成一项任务。

了解更多详情)。

图 10:命令行将作业拆分为多个进程

命令行

将作业拆分为多个进程并运行它们,可能同时运行。参见图 10 中的说明性示例。

输入、输出和管道

[编辑 | 编辑源代码]

在可能的情况下,Unix 命令的行为类似于过滤器,或者类似于数学上的函数概念:它们从输入中读取数据,操作该输入,然后写入输出。这听起来可能很琐碎,甚至有些多余,但它使简单的命令能够组合起来产生复杂的结果。每个命令都从 stdin(标准输入的缩写)读取数据,并写入 stdout(标准输出的缩写)。默认情况下,stdin 是从终端和键盘中键入的任何内容,而 stdout 连接到当前命令行,因此结果将显示在屏幕上。通过使用大于号 >,stdout 可以轻松地重定向到文件而不是显示在屏幕上。> 文件名 将 stdout 重定向到指定的文件,以便稍后查看。通过将许多简单的命令链接在一起,可以实现对输入的复杂转换。以下是一个高级示例,展示了如何使用一系列较小的步骤来实现复杂的输出。您可能还没有足够的 shell 知识来理解此示例中的所有内容,但请尝试逐一完成它并查看每个步骤的作用。每个命令的主要页面(见 获取帮助)可能会有所帮助。

压缩的目的是使文件更小,这对节省磁盘空间和加快通过互联网发送文件都很有用。某些类型的程序可以透明地在发送之前压缩文件,并在另一端解压缩,从而通过互联网发送数据。一些 Web 服务器实现了这一点,但对我们而言最重要的示例是 scp 和 sftp(用于通过网络传输文件的两个命令行程序),它们都可以使用 -C 选项来请求压缩。

简而言之,压缩程序在文件中查找经常重复的模式,并以稍后可以撤消的方式删除这种冗余。文本文件往往压缩得很好,100MB 的维基百科可以压缩到不到 16MB(参见 赫特奖 http://prize.hutter1.net/),特别是,生物序列往往可以很好地压缩,因为核苷酸或氨基酸字母表的字母数量很少。

用于压缩文件的两个最常见的工具是 gzipbzip2,它们各自用于解压缩的工具分别是 gunzipbunzip2gzip 是事实上的标准;bzip2 往往会产生更小的文件,但压缩时间更长。在 Windows 平台上,Zip(通常被称为 WinZip (http://www.winzip.com/))压缩方法更受欢迎,许多 Unix 平台提供 zipunzip 工具来处理这些文件。非 Linux Unix 平台(例如 Mac OS X)有更旧的工具,称为 compressuncompress,这些工具现在很少使用。对 Linux 上 compress 压缩文件的支持可能不完整且不可靠。例如,一位作者可以访问的一台机器具有一个 compress 手册页,但没有安装实际的工具。

最后要了解的一种方法,这种方法越来越流行,是 7-zip(7za)。7-zip 可以产生比上述所有方法都小的文件,但压缩时间更长。图 11 提供了一个文件后缀列表,可用于识别使用何种方法压缩了哪些文件。

图 11:用于识别压缩了哪些文件的后缀列表

如果将多个文件组合在一起然后压缩,而不是单独压缩它们,压缩的效果会更好,因为这使压缩程序能够发现文件之间的重复模式。在 Unix 上,将多个文件打包/解包到/从单个文件中的过程在历史上与压缩过程是分开的,这与拥有少量能够做好一件事的工具的理念相一致。Unix 用于打包和解包文件的工具是 tar“磁带归档器”,这个奇怪的名字是因为它的历史可以追溯到 1979 年,当时将文件写入磁带是常见的存储方法。

以下是如何使用 tar 压缩和解压缩存档中的文件的示例

ls
chimp.fasta human.fasta macaque.fasta orangutan.fasta
# Pack into single file. The suffix is your responsibility.  'c'  means create, and
#'f' means that the next argument is the filename to write to.
tar -cf sequences.tar *.fasta
Note that the original files are untouched

ls
chimp.fasta human.fasta macaque.fasta orangutan.fasta sequences.tar
# Delete all sequences
rm *.fasta
# 'x' means extract
tar -xf sequences.tar
ls
chimp.fasta human.fasta macaque.fasta orangutan.fasta sequences.tar

随着时间的推移,tar 的功能不断增加,使其更加方便,现代版本现在能够打包和压缩文件,如上面的示例所示。

ls

chimp.fasta human.fasta macaque.fasta orangutan.fasta sequences.tar
# Pack and gzip sequences simultaneously ( 'z'  tells tar to use gzip)
tar -zcf sequences.tgz *.fasta
#List the contents without extracting
tar -ztf sequences.tgz
chimp.fasta
human.fasta
macaque.fasta
orangutan.fasta
# More recent versions of tar can also bzip2 files
tar -jcf sequences.tbz2 *.fasta
tar -jtf sequences.tbz2
chimp.fasta
human.fasta
macaque.fasta
orangutan.fasta


图 12:常见压缩程序的文件后缀。当与 tar 组合以压缩多个文件时,通常将完整的 .tar.suffix 后缀缩短为上面给出的后缀。zip 和 7za“7-zip”具有 Windows 背景,并且具有将多个文件组合在一起的内置方法,因此很少与 tar 结合使用。file 工具也可用于确定文件类型,例如:file file.unknown.suffix 。有关详细信息,请参见 man file。

压缩和解压缩实际上是由同一个程序完成的。像 'gunzip' 这样的解压缩程序名称实际上只是方便的别名,它们告诉计算机以解压缩标志调用 gzip 程序。

在远程计算机上工作

[编辑 | 编辑源代码]

为什么要使用远程计算机?原因很多:首先,中央计算资源往往比您的笔记本电脑或 PC 更大、更可靠、更强大——如果您需要完成大量工作或使用大量数据,那么您可能别无选择,只能使用更大的计算机。

服务器级硬件和您桌上的东西之间也存在着天壤之别。不间断电源(即停电时的备用电池)就是一个例子。服务器往往还具有冗余组件和能够检测和纠正错误的内存。在高端,服务器可以检测和隔离故障部件,报告问题,并继续运行。通常,中央服务器用户第一次知道发生故障是在工程师带着替换部件出现的时候。

如果您有一个需要很长时间才能运行的工作,例如贝叶斯系统发育方法,您可能不想承诺让您的个人计算机闲置足够长的时间来完成分析(而且您真的信任您的同事不会将其关闭吗?),而中央设施则始终开启,并配备电池以防止电源供应中的小故障影响计算机。最后,也是最重要的是,中央计算机往往拥有更严格、更完善的数据备份策略——您是否定期备份?它们是否保存在与原始数据不同的物理位置?您上次检查备份是否真的有效是什么时候?

SSH(Secure SHell 的缩写)是一种连接到其他计算机并为其提供命令行访问权限的方法;一旦我们拥有一个命令行,我们就可以像使用本地命令行与本地计算机交互一样与远程计算机交互。SSH 替换了连接到远程计算机的旧方法 telnet,telnet 将所有内容(包括您的密码)作为普通的未加密文本发送,因此任何人都可以读取它。除非您知道自己在做什么,并且别无选择,否则不建议使用 telnet。同样,如果您可以使用 sftp 或 scp,请避免使用 FTP(文件传输协议)传输文件。

除了确保您的计算机和远程计算机之间的通信安全外,SSH 还允许您验证远程计算机是否是它声称的计算机——如果将流量发送到错误的位置,则安全保持流量毫无意义——并防止有人坐在连接中间监听每条消息,然后将其传递,假装自己是对方。(这被称为中间人攻击 http://en.wikipedia.org/wiki/Man-in-the-middle_attack。双方都认为自己正在与对方通信,但实际上是在与一个中间人通信,该中间人复制所有消息,然后将它们转发。)用于验证身份的方法,无需伪造,即使有人可以复制和操纵所有消息,也非常有趣,并且还有很多其他用途。请参阅 http://en.wikipedia.org/wiki/Public-key_cryptographyhttp://en.wikipedia.org/wiki/Digital_signature 了解详细信息。如果验证失败,您将收到类似图 13 中的警告消息,并且计算机将拒绝连接。

图 13:警告消息

到目前为止,大多数这些警告都是由无能的计算机管理而不是恶意行为造成的(例如,如果有人错误地升级了另一台机器,使其看起来像另一台计算机,您将收到此类错误)。如果您确定它是安全的,可以通过从 ~/.ssh/known_hosts 文件中删除计算机的相应行来处理警告。也可以在远程机器上运行图形程序,但除非您拥有非常快互联网连接,否则预计会出现停顿。启用此功能的系统称为 X 窗口系统(或简称 X 或 X11)(X 是 W 窗口系统的后继者,如果您想知道 X 从哪里来)。您可以在运行 ssh 时使用 -X 标志,以允许远程计算机在您的本地显示器上的新窗口中运行程序,前提是您的本地计算机上有能够理解正在发送的指令的软件。Linux 计算机默认情况下使用此类软件进行显示,Mac OS X 附带可以使用的软件(并在以下示例中由 ssh 自动启动)。在 Windows 上,Cygwin 软件提供了所需的功能。以下是如何使用带 -X 标志的 ssh 的示例。

传输文件

[edit | edit source]

可以使用 SSH 本身在计算机之间传输文件,但不建议这样做,因为存在更友好的界面。当然,还有许多图形文件传输程序可用。不推荐特定的程序,Cyber-duck http://cyberduck.ch/ 用于 Mac OS X 和 WinSCP http://winscp.net/ 用于 Windows,似乎是有用的选择,但还有很多其他选择。或者,在 Mac 和 Unix 下,可以挂载远程计算机上的目录,使其看起来像是本地的;搜索 sshfs 以获取详细信息。传输文件时,静默错误非常罕见,但可能会发生,因此我们希望能够验证接收到的文件是否与发送的文件相同。可以通过肉眼检查短文件,但无法在不再次传输文件的情况下实现自动化(这也可能出现错误)。一种常见的验证正确传输的技术是计算两个文件的 md5(消息摘要算法 5)并比较这些值。md5 是一个简短的字符字符串,用于标识文件,两个不同的文件极不可能共享相同的字符串——如果文件发生更改,其 md5 将(很可能)更改,因此我们知道发生了更改。故意创建两个具有相同校验和的不同文件非常困难。两个不同的随机文件具有相同 md5 的概率约为 3.4e38。当检查大量文件时,集合中两个文件具有相同 md5 的概率会迅速增加,但对于实际使用来说仍然足够小。更罕见的是,您可能会遇到 SHA 校验和,Unix 和 Mac 计算机上的 shasum,它与 md5 非常相似,但两个文件共享相同字符串的可能性更小。

获取帮助

[edit | edit source]

有关 Ubuntu 的一般帮助已在“适应”中介绍,或者,只需找到可以咨询的人即可。与其他一切一样,网络是良好、不良和彻头彻尾奇怪教程的丰富来源。

如果您几乎没有或根本没有编程经验,Python (https://www.pythonlang.cn/) 是学习如何进行有用的生物信息学脚本编写的不错选择,尤其是在与 Biopython 模块 (https://biopython.pythonlang.cn/) 结合使用时。Unix 通常有非常好的文档,尽管这些文档通常针对更经验丰富的用户。所有手册页都倾向于遵循相同的格式,熟悉它是一个好主意。该页将从命令的描述和所有标志的摘要开始。可选标志将用方括号括起来。接下来是对命令的完整描述以及每个标志的详细描述。有时还会有一节包含使用示例。Mac OS X 通常对 man 页非常一致,但 Linux 派生版本可能不尽相同。

图 14:查看 man example 的手册页

变量和编程

[edit | edit source]

到目前为止,我们只使用命令行来运行其他程序并将它们链接起来以实现更复杂的结果。命令行工具可以像编程语言本身一样使用,我们可以编写小程序来自动执行常见任务;通常这被称为脚本编写而不是编程,尽管区别并不十分重要。

很明显,学习编程不是一两个小时就能学会的,即使是经验丰富的程序员也要花几天时间才能在新的语言中提高效率,所以本节只能提供一小部分可能的内容;但是,它应该能够展示如何通过前期的一点投入就能节省大量时间。如果您对大量文件做着类似的操作,比如很多序列,在命令行中一遍又一遍地输入相同的命令既费时又枯燥,而且容易出错,尤其是当你感到厌烦的时候。脚本可以节省你大量的时间,让你可以去做其他事情,而计算机则为你完成这项任务。想想你上次需要重命名 100 个文件,或者更改数千个基因比对的格式,以便它们与你的系统发育程序兼容。学习一点脚本可以极大地加快这些任务的速度。就像任何事情一样,网上有很多教程,搜索“bash 脚本教程”或“bash 脚本入门”会得到很多完整性和可理解性各不相同的例子。

为了给您提供一些编程背景知识,我们下面准备了一个简短的通用教程。

首先介绍的是变量。变量只是一个数据的名称,一个有用的类比是带标签的盒子:每次我们看到标签时,我们都会在概念上用盒子的内容替换它。操纵变量,改变计算机的状态,是编程的基础。这里我们将介绍两种有用的情况:缩短常见的目录路径和对多个文件执行相同的操作。在 bash 脚本中,变量用美元符号加变量名来调用:$NAME。变量名中的字符有一些限制,并且变量名不能以数字开头。作为一个经验法则,最好只在您的变量名中使用大写或小写字母。

一个变量可以指代一个文件的名称,我们可以使用变量而不是显式地使用文件名在命令行中写入内容——改变变量,我们就在不同的文件上运行完全相同的命令。利用这一点的一种方法是将变量设置为多个文件中的一个,并使用历史记录来重复一组命令。当然,如果命令将其输出写入文件,那么每次都必须重命名该文件,否则每个文件的输出都会覆盖之前文件的输出。shell 脚本提供了一种替代方法:可以告诉计算机将变量依次设置为多个文件名中的每一个,并且可以自动编辑变量的值,以提供唯一输出文件的名称。

一个常见的 Unix 做法是将经常使用的函数集放在一个名为脚本的文件中,以便重复使用,从而避免重新输入它们时出错。编写脚本也意味着可以在提交运行它们处理多个文件之前测试包含多个步骤的复杂操作,如果我们处理大量基因,这可能需要几天的时间。脚本可以在任何常见的文本编辑器中编写和修改,但必须以文本格式保存;nano 是一个很好的基本编辑器,使用起来相当直观,但还有很多其他的编辑器专门为程序员设计。或者,您可以使用 gedit,它是一个类似于 Windows 上的记事本的程序(要访问 gedit,单击 Ubuntu 按钮并搜索 gedit;在命令行中输入 gedit & 也可以)。

行尾——兼容性问题

[edit | edit source]

即使在计算机的标准字母表 (ASCII——美国信息交换标准代码) 建立之后,关于如何指示一行结尾也没有达成一致。ASCII 提供了两种可能性:换行符 '\n' 和回车符 '\r' ,基于旧的打字机和电传打字机终端的工作方式:回车符将打印下一字符的位置移动到行首,换行符将纸张向下移动一行,但不会改变打印位置。在 Unix 上, '\n' 字符被认为是“换行符和回车符”,这用于分隔文本行。在 Windows 上,行用字符对 '\r\n' (按此顺序)分隔,旧版本的 Apple 操作系统(早于 OS X)使用 '\r' 来分隔行。Mac OS X 上的情况比较复杂,因为它必须同时处理其 Mac 和 Unix 传统;现在文件中的行官方上用 '\n' 分隔,但程序必须能够处理这两种约定。

更复杂的是,一些在机器之间传输文件的方法会尝试自动为您转换行尾。这通常是一个错误。特别是,一个名为 FTP 的旧文件传输方法(文件传输协议)有两种模式:文本模式和二进制模式,文本模式会尝试翻译行尾。Unix 平台默认使用二进制模式,通常是安全的。唯一需要谨慎的情况是从 Windows 使用命令行 FTP 应用程序传输文件。如果您在文本模式下通过 FTP 传输二进制文件,则接收到的文件将无法挽回地损坏。如有疑问,请参阅传输文件,了解如何验证您的文件是否已正确传输。

如果您已经读到这里,您可能会想:a) 这很复杂,b) 为什么我以前没有注意到?答案是,这在过去确实会导致问题,但程序员现在已经意识到了这些问题,并且程序往往会做正确的事情。一些编程语言(如 Perl)甚至可以透明地处理这些问题,因此即使是程序员也不再需要了解它们了。

Galaxy

[edit | edit source]

Galaxy 是一款针对各种 NGS 应用的开源 GUI 工具集。可以通过宾夕法尼亚州立大学服务器[5]访问,或者机构可以建立自己的服务器。用户可以保存和发布数据历史记录,以便将来使用或供其他人使用。它的教程和图形界面使它易于学习和使用。

用户可能还希望运行自己的 galaxy 实例,以进行测试、工具开发或生产使用。预配置的 Docker 容器使这变得非常简单。

以下是示例设置演示。

用户

docker pull bgruening/galaxy-stable
  • 运行 docker 容器
docker run -itp 8080:80 -v /local/dir/:/export bgruening/galaxy-stable

GeneTalk

[edit | edit source]

GeneTalk 中分析 VCF 文件的 5 个步骤,网址为 www.gene-talk.de

  1. 上传 VCF 文件
  2. 编辑系谱和表型信息,以便进行分离过滤
  3. 通过编辑以下过滤选项来过滤您的 VCF 文件
    • 功能过滤(过滤掉对蛋白质水平有影响的变异)
    • 连锁过滤(过滤掉位于指定染色体上的变异)
    • 基因组过滤(按基因或基因组过滤变异,订阅公开可用的基因组或创建自己的基因组)
    • 频率过滤(仅显示基因型频率低于指定值的变异)
    • 遗传模式过滤(按推测的遗传模式过滤变异)
    • 注释过滤(仅显示数据库中列出的变异)
  1. 查看结果和注释
  2. 编写自己的注释

BaseSpace

[edit | edit source]

参考文献

[edit | edit source]
  1. "GNU 操作系统". 自由软件基金会,Inc. 2016 年 4 月 11 日. 检索于 2016 年 4 月 28 日.
  2. "什么是版权?". 自由软件基金会,Inc. 2015年10月3日. 检索于 2016年4月28日.
  3. Ubuntu 文档团队. "官方 Ubuntu 文档". Canonical Ltd. 检索于 2016年4月28日.
  4. McIlroy, M.D.; Pinson, E.N.; Tague, B.A. (1978). "Unix 时分系统:前瞻". 贝尔系统技术杂志. 57 (6): 1899–1904.{{cite journal}}: CS1 维护:作者列表中的多个名字 (link)
  5. "Galaxy". usegalaxy.org. Galaxy 项目. 检索于 2016年4月28日.
华夏公益教科书