基本的 grep/awk 帮助 - 将包含术语列表的所有行从一个文件中提取到一个单独的文件中

Dis*_*coA 7 grep awk

我有两个文件genelist.txtdata.txt. genelist.txt仅包含约 500 个基因名称的单列,而data.txt包含约 1000 列(样本)和约 30,000 行(基因名称)的制表符分隔文件。的一般方案data.txt概述如下。

       Sample 1 Sample 2 Sample 3 Sample 4  Gene A      1.04       1.81        1.92        0.45     Gene B      1.11       1.12        1.32        0.92     Gene C      0.72       0.71        0.85        1.12     Gene D      1.19       1.42        0.13        0.32   

我需要从data.txt包含约 500 个基因名称中的每一个中提取每一行(整行,即所有样本),genelist.txt并将这些行提取到一个单独的文件中。有人告诉我使用 grep 或 awk 并研究了如何做到这一点,但是作为一个简单的生物学家,几乎没有/没有编码经验,我遇到了一些麻烦。是否有人可以解释这是如何完成的,并希望为我提供一些代码以开始工作。

如果提取仅返回与genelist.txt. 举例来说,如果我有ABC123但不ABC1234genelist.txt,我想只有ABC123被提取,而不是ABC1234

此外,完成此操作后,我将如何检查我的哪些基因genelist.txt未包含在提取中?(即某些基因可能命名不正确,因此我必须返回并使用其替代和/或正确名称重新提取它们)。

cas*_*cas 11

要从 中data.txt列出的基因中提取行genelist.txt

grep -w -F -f genelist.txt data.txt > newdata.txt
Run Code Online (Sandbox Code Playgroud)

grep 使用的选项:

  • -w告诉grep只匹配整个单词(即ABC123不会也匹配ABC1234)。
  • -F 搜索固定字符串(纯文本)而不是正则表达式
  • -f genelist.txt 从文件中读取搜索模式

如果您还需要标题(示例 1、示例 2 等)行:

grep -w -F -f genelist.txt -e Sample data.txt > newdata.txt
Run Code Online (Sandbox Code Playgroud)
  • -e Sample 也搜索“样品”

要查找genelist.txt不在的行newdata.txt

grep -v -w -F -f <(sed -E -e 's/(\t|  +).*//' newdata.txt) genelist.txt
Run Code Online (Sandbox Code Playgroud)
  • -v 反转搜索,打印不匹配的行。

的grep的选项的其余部分是相同的,但不是使用同一个文件-f的选项,它使用一种叫进程替换(见),它允许你在一个地方实际文件的使用的命令。命令创建的任何输出都被视为“文件”的内容。

在这种情况下,我们使用命令sed -E -e 's/(\t| +).*//' newdata.txt,它在首先删除第一个 TAB 字符或它看到的第一对空格中的所有内容后输出 newdata.txt 的每一行。换句话说,第一个字段(例如“基因 A”)。我不得不使用 TAB 或双空格,因为 a) 我不确定您的数据是空格分隔还是 TAB 分隔,并且 b) 示例中的第一个字段包含空格。

sed 使用的选项:

  • -E使用扩展的正则表达式,因此我们可以使用普通的(, ), 和+比必须使用\as \(, \),转义它们更具可读性\+
  • -e 's/(\t| +).*//' 指定要应用于输入的 sed 脚本 (newdata.txt)

在您的示例上运行该命令data.txt将产生以下输出:

$ sed -E -e 's/(\t|  +).*//' data.txt

Gene A
Gene B
Gene C
Gene D
Run Code Online (Sandbox Code Playgroud)

无论如何,该sed命令的输出用作该命令的搜索模式列表grep