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

Merge two large text files by common row to one mapping file

我有两个格式相似的文本文件。第一个 (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
--

请注意,关键区别在于每个条目的 header(lib_1749 与 Stool268_1)。我需要的是使用序列(例如,TACGGAGGATGCGAGCGTTATCCGGAT...)作为键,在一个文件的 header 和第二个文件的 header 之间创建一个映射文件。

请注意,作为最后一个并发症,映射不会是一对一的,对于 lib[=26 的每个条目,将有多个形式为 Stool****** 的条目=]****。这是因为第一个文件中的密钥长度被修剪为 200 个字符,但在第二个文件中它可以更长。

对于较小的文件,我会在 python 中执行类似的操作,但我经常遇到麻烦,因为这些文件太大,无法一次读入内存。通常我会尝试 unix 实用程序,但在这种情况下,我想不出如何完成它。

谢谢!

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

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

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

顺便说一句。您可能会发现 SequenceServer(Google 它)有助于设置自定义 Blast 数据库和您的 BLAST 环境...

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)