Python 用单独文件中的完整注释替换blast报告中的id

Python 用单独文件中的完整注释替换blast报告中的id,python,replace,annotations,blast,Python,Replace,Annotations,Blast,我有一个带有以下格式注释的文件: XS-5236245.2_hypothetical_protein c16_g1_i1 len=581 path=[12725:0-580] XS-5236245.2 94.9 59 3 0 403 579 254 312 8.6e-27 116.3 以及以制表符分隔的blast报告,第二列中仅包含登录id: transcript1 XS-5236245.2 94.3 35 0 245 356 789 89

我有一个带有以下格式注释的文件:

  XS-5236245.2_hypothetical_protein
c16_g1_i1 len=581 path=[12725:0-580]    XS-5236245.2    94.9    59  3   0   403 579 254 312 8.6e-27 116.3
以及以制表符分隔的blast报告,第二列中仅包含登录id:

  transcript1  XS-5236245.2  94.3  35  0  245  356  789  896  1e-230 6.3
当存在匹配项时,我想用注释文件中的整行替换blast报告中的accession_id。这是我的尝试,正如您所看到的,我使用非常基本的python。如果你能给我一个更复杂的解决方案,我希望你能解释一下。谢谢你的帮助

利努


我找到了这样的解决方案:

创建一个包含两列的新文件accessionid_headers.txt,第一列包含登录ID,第二列包含完整的标题。python很容易做到这一点:

#!usr/bin/env python
import sys

f1 = open(sys.argv[1],'r')
f2 = open(sys.argv[2],'w')

for line in f1:
    splitline = line.split('_')
    accessionid = splitline[0]
    f2.write('{0} {1}'.format(accessionid, line))

f1.close()
f2.close()
使用以下格式的爆炸报告:

  XS-5236245.2_hypothetical_protein
c16_g1_i1 len=581 path=[12725:0-580]    XS-5236245.2    94.9    59  3   0   403 579 254 312 8.6e-27 116.3
我应用了以下我修改过的awk,以适应我的文件,但由于我不是awk方面的专家,无法充分解释每个步骤。也许有人可以解释每一步都在做什么:

awk 'NR==FNR{a[$1]=$2;next}$4 in a{$4=a[$4]}1' accession_headers.txt blast.report > outfile 

实际上,它并不适用于所有字段,它只替换了一些字段,并且所有字段都应该有一个匹配项,所以也许有人可以帮助更正awk命令。