如何将file1的第1列和第2列与file2的column1中的单元循环匹配,以便将它们替换为文件2的第2列中的相邻单元格?

时间:2018-02-26 17:31:36

标签: perl awk bioinformatics genetics

我正在为项目使用String-db交互,但我发现完整的交互列表使用了他们的ensembl蛋白ID。我想用他们的HGNC批准的基因符号替换那些ensembl蛋白质ID名称。使用BioMart,我下载了一个包含ensembl蛋白质ID及其各自基因名称的表格。所以我需要匹配字符串文件中的所有ensembl ID(第一列和第二列都有ensembl ID)和我们的biomart文件中的ensembl ID,然后在biomart文件中替换每个ID及其找到的基因符号。我有一个额外的复杂功能,我有一个" 9606。"在字符串文件中的每个ensembl ID之前,而不是在BioMart文件中。这个数字表示它是一个人类的ensembl ID,仍然需要在新的tbl String文件中。

注意:这些文件很大!

字符串文件示例(前10行):

9606.ENSP00000000233    9606.ENSP00000263025    ptmod       f   f   150
9606.ENSP00000000233    9606.ENSP00000265709    reaction    f   f   908
9606.ENSP00000000233    9606.ENSP00000265709    catalysis   t   t   908
9606.ENSP00000000233    9606.ENSP00000263025    inhibition  inhibition  t   t   154
9606.ENSP00000000233    9606.ENSP00000265709    binding     f   t   908
9606.ENSP00000000233    9606.ENSP00000265709    catalysis   t   f   908
9606.ENSP00000000233    9606.ENSP00000263025    inhibition  inhibition  f   t   150
9606.ENSP00000000233    9606.ENSP00000263025    inhibition  inhibition  f   f   150
9606.ENSP00000000233    9606.ENSP00000265709    binding     f   f   908
9606.ENSP00000000233    9606.ENSP00000263025    catalysis   t   t   156

BioMart文件(用于处理上述文件的示例):

Ensembl_Protein_ID  Gene_Symbol
ENSP00000265709 ANK1
ENSP00000000233 ARF5
ENSP00000263025 MAPK3
ENSP00000388118 NCSTN

输出文件:

9606.ARF5   9606.MAPK3  ptmod       f   f   150
9606.ARF5   9606.ANK1   reaction    f   f   908
9606.ARF5   9606.ANK1   catalysis   t   t   908
9606.ARF5   9606.MAPK3  inhibition  inhibition  t   t   154
9606.ARF5   9606.ANK1   binding     f   t   908
9606.ARF5   9606.ANK1   catalysis   t   f   908
9606.ARF5   9606.MAPK3  inhibition  inhibition  f   t   150
9606.ARF5   9606.MAPK3  inhibition  inhibition  f   f   150
9606.ARF5   9606.ANK1   binding     f   f   908
9606.ARF5   9606.MAPK3  catalysis   t   t   156

我不知道该怎么做。我尝试过使用awk和perl,但没有任何效果。我仍然是生物信息学方面的菜鸟。如果有人愿意帮助这个可怜的家伙,我会非常感激。

1 个答案:

答案 0 :(得分:0)

Sounds like all you need (assuming all values from String are present in BioMart like in your example) is:

awk '
NR==FNR{ map[$1]=$2; next }
{
    for (i=1; i<=2; i++) {
        split($i,f,/[.]/)
        $i = f[1] "." map[f[2]]
    }
    print
}
' BioMartFile StringFile