从基因列表中识别基因

use*_*373 7 grep awk text-processing

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

    SWT21
    SSA1
    NRP1
    EFB1
    TFC3
    MDM10
Run Code Online (Sandbox Code Playgroud)

我还有另一个文件,其中也包含我列表中这些基因的名称以及有关它们的其他基本信息。第二个文件看起来像这样:

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
Run Code Online (Sandbox Code Playgroud)

我想在第二个文件中提取那些具有第一个文件中存在的基因名称的行。

ter*_*don 10

您只需要一个简单的grep

grep -Fwf gene_list.txt gene_info.txt
Run Code Online (Sandbox Code Playgroud)

使用的选项是:

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

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

sed -i 's/ //g' gene_list.txt
Run Code Online (Sandbox Code Playgroud)


jas*_*yan 7

awk wiki上的一个例子:

awk 'FNR==NR {arr[$0];next} $6 in arr' gene_list info_list
Run Code Online (Sandbox Code Playgroud)

从维基条目复制的解释:

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