2016-07-08 2 views
1

Я новичок в мире программирования, поэтому, если я просто задал простой или очевидный вопрос, пожалуйста, простите меня. Мне очень нужна помощь.Как сравнить два разных файла и извлечь перекрывающиеся данные?

В настоящее время у меня есть два набора данных.

Первый выглядит следующим образом (назовем его file1):

GeneName 
TAF13 
ZC3H6 
RAC3 
MED16 
FAT3 
SCRG1 
GRM3 
DHX16 
LRRN4CL 
STMN4 
PCDHGA11 
RPLP1 
WASF1 
KATNAL1 
FTL1 
D8ERTD738E 

Второй выглядит следующим образом (назовем его "file2"):

GeneName Chr Start End SumOfMerge 67_1 67_2 67_3 68_1 68_2 68_3 69_1 69_2 69_3 70_1 70_2 70_3 71_1 71_2 71_3 72_1 72_2 72_3 73_1 73_2 73_3  
LOC100288069 chr1 713126 714875 13 NA nPk1 nPk1 NA nPk1 nPk1 NA NA nPk1 NA nPk2 nPk1 NA nPk1 nPk1 NA nPk1 nPk1 NA nPk1 nPk1  
FAM87B chr1 752176 752900 20 nPk2 nPk3 nPk2 nPk2 nPk3 nPk3 nPk2 nPk3 nPk3 nPk2 nPk4 NA nPk3 nPk3 nPk3 nPk3 nPk3 nPk2 nPk2 nPk3 nPk3  
LINC00115 chr1 761026 763300 20 nPk7 nPk6 nPk3 nPk7 nPk5 nPk4 nPk7 nPk8 nPk5 NA nPk5 nPk3 nPk8 nPk6 nPk4 nPk7 nPk7 nPk3 nPk8 nPk7 nPk4  
SAMD11 chr1 858401 862175 20 nPk16 NA nPk10 nPk16 nPk13 nPk13|nPk14 nPk16 nPk16 nPk13 nPk14 nPk13 NA nPk18 nPk13 nPk11|nPk12 nPk17 NA nPk12 nPk17 nPk16 nPk11 
KLHL17|NOC2L chr1 892751 897375 21 nPk23 nPk14 nPk15 nPk24|nPk25 NA nPk18 nPk25 nPk20 nPk18 nPk24 nPk18 nPk10 nPk27|nPk28 nPk17 NA nPk25 nPk18 nPk18 nPk24 nPk20 nPk16 
HES4 chr1 934201 937725 14 nPk30 nPk19 nPk19 NA nPk24 nPk22 nPk33 nPk25 nPk22 NA NA NA NA NA nPk23 nPk32 nPk23 nPk22 NA nPk25 nPk20 
ISG15 chr1 948076 948750 7 nPk32 NA NA nPk33 NA NA nPk36 NA NA nPk35 NA NA nPk37 NA NA nPk34 NA NA nPk36 NA NA 
AGRN chr1 954376 954875 21 nPk34 nPk22 nPk21 nPk36 nPk27 nPk24 nPk38 nPk28 nPk24 nPk37 nPk24 nPk16 nPk39 nPk24 nPk25 nPk36 nPk26 nPk24 nPk38 nPk28 nPk22 
AGRN chr1 954951 955275 11 NA NA nPk22 NA nPk28 nPk25 NA nPk29 nPk25 NA nPk25 nPk17 NA NA nPk26 NA nPk27 nPk25 NA NA nPk23 
C1orf159 chr1 1051051 1052500 21 nPk53 nPk38 nPk37 nPk56 nPk42 nPk39 nPk60 nPk42 nPk41 nPk54 nPk38 nPk25 nPk55 nPk40 nPk40 nPk57 nPk45 nPk38 nPk55 nPk50 nPk38 
LINC01342 chr1 1070301 1073175 2 NA NA NA NA NA NA NA NA NA NA nPk40 nPk28 NA NA NA NA NA NA NA NA NA 
TTLL10 chr1 1108776 1109450 1 NA NA NA NA NA NA NA NA NA nPk65 Na NA NA NA NA NA NA NA NA NA NA 
TNFRSF4 chr1 1150276 1150750 2 NA NA NA NA NA NA NA NA NA nPk72 NA NA nPk72 NA NA NA NA NA NA NA NA 
SDF4 chr1 1165926 1167475 4 NA NA NA NA NA nPk48 NA NA NA NA NA NA NA NA nPk50 NA NA nPk45 NA NA nPk46 

Пожалуйста, простите меня, если второй данные вышли действительно беспорядочно, на самом деле это данные с 26 столбцами, каждая из которых разделена пространством вкладок.

Моя цель - сравнить файл1 и файл2 с первым столбцом «GeneName» и извлечь строки из файла2 в новый файл file3.

file3 должен выглядеть как файл2, за исключением того, что они содержат только те строки, которые имеют одинаковое имя Gene как file1.

В настоящее время я пробовал с comm и join и grep -f, никто не дал решение, которое я хочу. Думаю, grep может быть достаточно, чтобы выполнить эту работу, но я не знаю правильных вариантов. Если есть какие-либо другие возможные решения этой проблемы, пожалуйста, поделитесь со мной. Благодарю вас за это время!

+0

Это было бы довольно легко с Python. Есть ли у вас какой-либо опыт, или это будет приемлемо? – Alden

+0

@ Alden Я не знаком с этим, но могу приложить все усилия, чтобы понять код. Спасибо, в любом случае! :) –

ответ

1

Как вы относитесь к небольшому питонному коду?

#!/usr/bin/python 

import sys, re 

lookup = {} 
for line in open(sys.argv[1]).readlines(): 
    lookup[line.rstrip()] = True 

for line in open(sys.argv[2]).readlines(): 
    s = re.split('[\t ]+', line) 
    if len(s) > 0 and s[0] in lookup: 
    print(line.rstrip()) 

Если файл сохраняется как py.py, то:

chmod 755 py.py 
./py.py file1 file2 > file3 

На данный момент вы можете дополнительно настроить файл немного, чтобы не быть чувствительны к регистру? Добавьте .lower() в ключ поиска и s [0].

2

Grep + баш:

grep -f <(tail -n +2 file1 | sed 's/^/^/g') file2 > file3 

Это удалит GeneName колонку (пропуская первую строку с помощью tail -n +2 - начать печать из второй строки) и добавить ^ (регулярное выражение для начала строки) в начале каждого line - такой список является хорошим для grep -f, чтобы соответствовать строкам и записывать их в файл3.

Предполагается, что вы не хотите, чтобы строка вывода (GeneName) выводилась на выходе.

+1

Благодарим за ответ. Я попробовал код, но полученный файл полностью пуст. Я проверил, что есть перекрывающиеся данные, поэтому должно быть не менее нескольких строк. Кроме того, вы можете объяснить немного больше о цели замены GeneName на ^? Спасибо! –

+0

@DLee 'grep -v' предназначен для печати всех строк, которые НЕ соответствуют, я заменил его на хвост –

+0

@DLee У вас есть примеры реальной жизни, которые бы соответствовали? Я тестировал его с моим примером, и он работает, поэтому могут возникнуть некоторые проблемы с вводом. –

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