我有两个文件genelist.txt
和data.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但不ABC1234中genelist.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
。