在不同的.text文件中查找公共ID并附加其他相应的行

时间:2014-03-20 15:40:48

标签: python bioinformatics

我正在尝试查找两个文件中存在的公共ID,并将结果打印到一个新文件中,附加与这些ID对应的附加行。我该怎么办?

输入file1.txt

F775_23607  EMT15298  GO:0003674    molecular_function PF08268  345
F775_00510  EMT20601  GO:0005515    protein binding    PF08268  456
F775_00510  EMT23774  GO:0003674    molecular_function PF00646  134
F775_00510  EMT23774  GO:0005515    protein binding    PF03106  888
F775_23182  EMT33502  GO:0003677    DNA binding    PF03106  789

输入file2.txt

contig15    EMT15298  95.27 148
contig18    EMT04099  97.95 293 
contig18    EMT20601  92.83 293 
contig18    EMT23062  93.17 293

所需的输出文件(我希望能够决定要打印哪些行而不是哪些行)

EMT15298  GO:0003674 molecular_function PF08268
EMT20601  GO:0005515 protein binding    PF08268

我的脚本(基本上只打印列,这是共同的)

fileA = open("file1.txt",'r')
fileB = open("file2.txt",'r')
output = open("results.txt",'w')
fileA.next()

setA = set()
for line1 in fileA:
    listA = line1.split('\t')
    setA.add(listA[1])
setB = set()
for line1 in fileB:
    listB = line1.split('\t')
    setB.add(listB[1])
for key in setA & setB:
    output.writelines(key+'\n')

3 个答案:

答案 0 :(得分:1)

由于您的第一个文本文件包含输出的所有“字段”,因此我们可以略微减少逻辑和步数。

首先,我们打开两个输入文件并将其读入列表:

with open('file1.txt', 'r') as a, open('file2.txt','r') as b:
    fileA = [l.rstrip('\n').split('\t')[1:5] for l in a.readlines()]
    fileB = [l.rstrip('\n').split('\t')[1:] for l in b.readlines()]

现在我们有两个列表,fileAfileB。您会注意到它们上的切片表示法。由于fileA具有输出所需的所有值,因此它现在已准备就绪,只需要针对第二个列表进行过滤。我还从两个列表中删除了第一项,以便我们可以使用EMT...值进行比较。

现在我们可以检查fileB是否包含(不完整)fileA并将匹配项写入结果文件:

with open('results.txt','w') as o:
    for line in fileA:
        if any(line[0] in l for l in fileB):
            o.write('%s\n' % '\t'.join(line))

results.txt再次以制表符分隔相应的匹配项:

EMT15298    GO:0003674  molecular_function  PF08268
EMT20601    GO:0005515  protein binding PF08268

答案 1 :(得分:0)

您可以使用dict代替set s:

fileA = open("file1.txt",'r')
fileB = open("file2.txt",'r')
output = open("results.txt",'w')

dictA = dict()
for line1 in fileA:
    listA = line1.split('\t')
    dictA[listA[1]] = listA

dictB = dict()
for line1 in fileB:
    listB = line1.split('\t')
    dictB[listB[1]] = listB

for key in set(dictA).intersection(dictB):
    output.write(dictA[key][1] + '\t' + dictA[key][2] + '\t' + dictA[key][3] + '\t' + dictA[key][4] + '\n')

答案 2 :(得分:0)

如果您只想进行“连接”操作,可以使用指定第二列的unix join命令,对于制表符分隔文件,它就像:

join file1.txt file2.txt -j2

您需要对行进行排序,否则它将无法工作,但您也可以使用也可用的sort命令。

此外,要选择要使用的列,可以使用管道切割功能:

join file1.txt file2.txt -j2 | cut -f2,3,4,5