将文件 1 与文件 2 匹配

将文件 1 与文件 2 匹配

我有两个文件,在 File1 中有基因相互作用(基因符号),另一个 File2 有基因符号及其相应的 Ensembl ID。

文件1

GeneA GeneB
GeneA GeneD
GeneC GeneB

文件2

GeneA    Ensembl1
GeneB    Ensembl2
GeneC    Ensembl3 

现在我想要一个具有如下输出的文件 File3

GeneA Ensembl1 GeneB Ensembl2
GeneA Ensembl1 GeneD NA
GeneC Ensembl3 GeneB Ensembl2

如果您注意到 File2 中没有 GeneD,因此当没有找到该基因的 Ensembl ID 时,将针对它输入 NA。有人可以帮助我实现它吗?

答案1

awk解决方案:

awk 'NR==FNR{ a[$1]=$2; next }
     { $1=$1 FS (($1 in a)? a[$1]:"NA"); $2=$2 FS (($2 in a)? a[$2]:"NA"); }1' File2 File1

输出:

GeneA Ensembl1 GeneB Ensembl2
GeneA Ensembl1 GeneD NA
GeneC Ensembl3 GeneB Ensembl2

答案2

perl -lane '
   @ARGV and $h{$F[0]}=$F[1],next;
   print join $", map { $_ , $h{$_} // "NA" } @F;
' File2 File1

结果

GeneA Ensembl1 GeneB Ensembl2
GeneA Ensembl1 GeneD NA
GeneC Ensembl3 GeneB Ensembl2

在职的

  • 首先将参数列表中的 File2 提供给 Perl,然后提供 File1。
  • 建立一个哈希%h,其键为 GeneA、GeneB 等。 => 值是来自 File2 的集合。请注意,在处理 File2 时,@ARGV 有一个元素,因此标量上下文中的 @ARGV 返回 true。
  • 在 File1 读入期间,@ARGV 减少到零,因此不评估第一行。第二行将在适当的映射转换后打印字段并通过空格连接在一起($“默认为空格)。

相关内容