2017-02-10 77 views
1

我有两个标签,delimted大文件,查找两条线共同的元素,从两个文件

1)Bmag0905 chr7B 401656584 401656568 
Bmag0905 chr7A 459876086 459876070 
Bmag0904 chr2B 472060312 472060296 
Bmag0904 chr2A 373596126 373596110 
Bmag0904 chr7B 401656584 401656568 

2)Bmag0905 chr7B 172039378 172039358 
Bmag0905 chr4B 186310411 186310431 
Bmag0904 chr4B 532339252 532339232 
Bmag0904 chr2B 708832397 708832377 
Bmag0904 chr3A 673781330 673781350 

我想这是常见的无论是在第一和第二线的元素。所以,我的输出会是这样,

Bmag0905 chr7B 401656584 401656568 Bmag0905 chr7B 172039378 172039358 
Bmag0904 chr2B 472060312 472060296 Bmag0904 chr2B 708832397 708832377 

所以,这就是我如何创建一个字典,现在的问题是如何将所需的行发现类似上面和打印的常见元素在一个新的文件?另外,我应该按元素[0]分组吗?使用一对前两个列中的值作为键的基于

fileA = open("input1.txt",'r') 
fileB = open("input2.txt",'r') 
output = open("shared",'w') 
dictA = {} 
for line1 in fileA: 
    new_list=line1.rstrip('\n').split('\t') 
    query=new_list[0] 
    subject=new_list[1] 
    dictA.setdefault((query), []).append(subject) 
dictB = {} 
for line1 in fileB: 
    new_list=line1.rstrip('\n').split('\t') 
    query=new_list[0] 
    subject=new_list[1] 
    dictB.setdefault((query), []).append(subject) 
Shared ={} 
for id1, value1 in dictA.items(): (?) 
    if id1 in dictB.keys():(?) 
+1

避免'如果ID1在dictB.keys()':做'如果ID1在dictB' –

+0

你是否愿意使用已经这样做的Unix/Linux实用程序,或者您需要Python解决方案? –

+0

我更喜欢Python解决方案...谢谢..但你可以提到哪个工具,我可以看看并学习,我可能会发现它更有用 – user3224522

回答

2
一些

csvset溶液。我把它从你的样品输入/输出中的共性是基于TE前两列:

import csv 

read_a = csv.reader(filaA, delimiter='\t') 
read_b = csv.reader(filaB, delimiter='\t') 

dict_a = {tuple(row[:2]): row for row in read_a} 
dict_b = {tuple(row[:2]): row for row in read_b} 

shared_keys = set(dict_a) & set(dict_b) # intersection of keys 

writer = csv.writer(open('file.csv', 'w'), delimiter='\t') 
writer.writerows(dict_a[k] + dict_b[k] for k in shared_keys) 
+1

谢谢!一个问题:如果我有Bmag0905 chr7B这两个文件重复2-3次(不同的行[2]和[3]),代码将如何处理? – user3224522

+0

只会在'dict_a/b'中出现一次。你怎么知道哪一对匹配? – schwobaseggl

+0

我不知道...可能是解决方案可以匹配所有类似的情况吗?如果我有Bmag0905 chr7B Bmag0905 chr7A在1文件和第二个Bmag0905 chr7B Bmag0905 chr7A作为好吧,它会同时打印,对不对,只是为了理解剧本 – user3224522