我有两个文件,在 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 减少到零,因此不评估第一行。第二行将在适当的映射转换后打印字段并通过空格连接在一起($“默认为空格)。