2015-02-25 1 views
2

У меня есть два текстовых файла, которые имеют схожие форматирование. Первый (732KB):Объединить два больших текстовых файла по общей строке в один файл сопоставления

>lib_1749;size=599; 
TACGGAGGATGCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCGGACTATTAAGTCAGCTGTGAAAGTTTGCGGCTCAACCGTAAAATTGCTAGCGGTGAAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCTCACTAGACTGTCACTGACACTGATGCTCGAAAGTGTGGGTATCAAACA 
-- 
>lib_2235;size=456; 
TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCGGACTATTAAGTCAGCTGTGAAAGTTTGCGGCTCAACCGTAAAATTGCTAGCGGTGAAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCTTACTGGACTGTAACTGACGTTGAGGCTCGAAAGCGTGGGGAGCAAACA 
-- 
>lib_13686;size=69; 
TACGTATGGAGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGTGTAGGTGGCCAGGCAAGTCAGAAGTGAAAGCCCGGGGCTCAACCCCGGGGCTGGTAGCGGTGAAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTGCTGGACTGTAACTGACACTGAGGCTCGAAAGCGTGGGGAGCAAACA 
-- 

второй (5.26GB):

>Stool268_1 HWI-ST155_0605:1:1101:1194:2070#CTGTCTCTCCTA 
TACGGAGGATGCGAGCGTTATCCGGATTTACTGGGTTTAAAGGGAGCGCAGACGGGACGTTAAGTCAGCTGTGAAAGTTTGGGGCTCAACCCTAAAACTGCTAGCGGTGAAATGCTTAGATATCGGGAGGAACTCCGGTTGCGAAGGCAGCATACTGGACTGCAACTGACGCTGATGCTCGAAAGTGTGGGTATCAAACAGG 
-- 

Примечание ключевым отличием является заголовок для каждой записи (lib_1749 против Stool268_1). Мне нужно создать файл сопоставления между заголовками одного файла и заголовками второго, используя последовательность (например, TACGGAGGATGCGAGCGTTATCCGGAT...) в качестве ключа.

Обратите внимание, что в качестве одного из последних осложнений сопоставление не будет 1-к-1, будет несколько записей формы Stool *** *** для каждой записи библиотеки ****. Это связано с тем, что длина ключа в первом файле была обрезана, чтобы иметь 200 символов, но во втором файле она может быть длиннее.

Для небольших файлов я бы просто сделал что-то подобное в python, но у меня часто возникают проблемы, потому что эти файлы настолько большие и не могут быть прочитаны в памяти за один раз. Обычно я пытаюсь использовать утилиты unix, но в этом случае я не могу придумать, как это сделать.

Спасибо!

+1

Вы можете прочитать большой файл [одна строка в то время] (https://stackoverflow.com/questions/8009882/how-to-read-large-file-line-by-line-in- python) в Python. –

+0

Это было бы выполнено с помощью чего-то вроде MySQL или SQLite – heathobrien

ответ

0

BioPython должен уметь читать в больших файлах FASTA.

from Bio import SeqIO 
from collections import defaultdict 

mapping = defaultdict(list) 

for stool_record in SeqIO.parse('stool.fasta', 'fasta'): 
    stool_seq = str(stool_record.seq) 

    for lib_record in SeqIO.parse('libs.fasta', 'fasta'): 
     lib_seq = str(lib_record.seq) 

     if stool_seq.startswith(lib_seq): 
      mapping[lib_record.id.split(';')[0]].append(stool_record.id) 
1

На мой взгляд, самый простой способ будет использовать BLAST + ...

Установите больший размер файла, как база данных BLAST и использовать меньший размер файла в качестве запроса ...

Тогда просто написать небольшой сценарий для анализа вывода - Т.е. Возьмите верхний удар или два, чтобы создать файл сопоставления.

BTW. Вы можете найти SequenceServer (Google it) полезным при настройке пользовательской базы данных взрыва и вашей среды BLAST ...

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