从基因列表中识别基因

从基因列表中识别基因

我有一个基因列表文件。像这样的事情

    SWT21
    SSA1
    NRP1
    EFB1
    TFC3
    MDM10

我有另一个文件,其中还包含列表中这些基因的名称以及有关它们的其他基本信息。第二个文件如下所示:

chrI    147593  151166  YAL001C -   TFC3
chrI    143706  147531  YAL002W +   VPS8
chrI    142173  143160  YAL003W +   EFB1
chrI    140759  141407  YAL004W +   YAL004W
chrI    139502  141431  YAL005C -   SSA1
chrI    137697  138345  YAL007C -   ERP2
chrI    136913  137510  YAL008W +   FUN14
chrI    135853  136633  YAL009W +   SPO7
chrI    134183  135665  YAL010C -   MDM10

我想提取第二个文件中的那些行,这些行的基因名称与第一个文件中的基因名称相同。

答案1

您所需要的只是一个简单的grep

grep -Fwf gene_list.txt gene_info.txt

使用的选项是:

  • -w :搜索整个单词,这确保基因名称ERK1不会与基因匹配ERK12-w不是标准选项,但相当常见)
  • -f :从文件中读取要搜索的模式。在这种情况下gene_list.txt
  • -F :将模式视为字符串,而不是正则表达式。这确保像这样的基因名称TOR*(如果存在这样的东西)不会匹配TORRRRRR

注意:这假设有没有空间围绕列表中的基因名称。如果有,您需要先删除它们(此处使用 GNU sed):

sed -i 's/ //g' gene_list.txt

答案2

从一个例子来看awk 维基:

awk 'FNR==NR {arr[$0];next} $6 in arr' gene_list info_list

从 wiki 条目复制的解释:

  • FNR == NR:当记录数等于文件中的记录数时,此测试为真。这仅适用于第一个文件,对于第二个文件,NR 将等于 file1 + FNR 的行数。
  • arr[$0]:这是一种通过整行创建数组元素索引的经典技术。这将创建一个包含 file1 名字的数组。
  • next:这将跳到下一个记录,因此不再对 file1 进行处理。
  • $6 in arr:这只会发生在file2的记录上,因为next.如果 $1 存在于 arr 中,即 file1 中,则将执行默认操作并打印该行。

答案3

为了更加稳健,您可以将基因列表更改为正则表达式以在行末尾进行匹配。这应该可以工作(并且与 POSIX 兼容):

sed 's/[[:space:]]*$/[[:space:]]*$/' gene_list | grep -wf - gene_info

gene_list或者在(按照问题中的示例)中添加前导空格:

sed 's/$/[[:space:]]*$/; s/[[:space:]]//' gene_list |
  grep -wf - gene_info

当然,如果基因名称中包含由正则表达式解释的字符,则这将不起作用。 Atlhough,如果是这种情况,那么您需要添加额外的替换表达式来sed转义它们,例如s:\[:\[:

答案4

你也可以在linux中使用grep命令,通过给出像egrep -wi“完整的基因列表(1)与基因之间的诱导管道”“文件名包含所有基因(2)”这样的命令。这里genelist(1)是你的基因列表说它是20数量和基因 (2) 包含完整基因的文件(数量 1000)

相关内容