将两个大文本文件按公共行合并到一个映射文件

时间:2015-02-25 20:44:58

标签: python regex unix merge bioinformatics

我有两个具有相似格式的文本文件。第一个(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,对于lib的每个条目,将有多个Stool *** ***形式的条目 *** *。这是因为第一个文件中的键的长度被修剪为200个字符,但在第二个文件中它可以更长。

对于较小的文件我会在python中做这样的事情,但我经常遇到麻烦,因为这些文件太大而且无法一次读入内存。通常我会尝试使用unix实用程序,但在这种情况下,我无法想到如何实现这一点。

谢谢!

2 个答案:

答案 0 :(得分:1)

在我看来,最简单的方法是使用BLAST + ...

将较大的文件设置为BLAST数据库,并使用较小的文件作为查询...

然后只需编写一个小脚本来分析输出 - 即。取一个或两个顶部来创建映射文件。

顺便说一句。您可能会发现SequenceServer(Google it)在设置自定义Blast数据库和BLAST环境方面很有帮助......

答案 1 :(得分: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)