我正在尝试查找两个文件中存在的公共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')
答案 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()]
现在我们有两个列表,fileA
和fileB
。您会注意到它们上的切片表示法。由于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