2017-02-10 10 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 

Я хочу, чтобы получить элементы, которые являются общими как в 1-й и 2-й линии. Так что мой результат будет, как это,

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

Некоторые csv и set на основе решения с использованием пары первых двух значений столбцов в качестве ключей. Я беру его из образца входов/выводе, что обыденность основан на тэ первых двух столбцов:

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 as ну, он будет печатать оба, правда? Извините, просто чтобы понять скрипт – user3224522

Смежные вопросы