从两个FASTA文件循环id

时间:2017-02-20 00:26:14

标签: bash loops pipe fasta

我有两个包含多个序列的fasta文件

cat file1.fasta
>1
ACGTCGAT
>2
ACTTTATT
>3
ACGGGG

cat file2.fasta
>1
CCGGAGC
>2
TGTCAGTC
>3
CTACGTCTT

我还有一个每个fasta文件的ID列表,我想用它来按ID提取特定序列,制作一个2序列fasta,然后执行一些操作(对齐,计算距离)。

解释

cat file1.list
1
3
cat file2.list
2
1 

实际上,这些fasta文件和列表是数千个序列/行长

我试图遍历列表中的每一行以提取与该特定id /行匹配的fasta文件,然后将来自每个文件的fasta序列组合成可以对齐的两个序列fasta文件等。基本上,我想要每个fasta序列与它的"对#34;成对对齐。

基于此处的示例和列表ID顺序,我想将file1.fasta中的fasta序列1与file2.fasta中的fasta序列2配对,然后转到下一对(来自file1.fasta的序列3) ,以及来自file2.fasta等的序列1)。基于id提取fasta序列相对容易(有几种方法可以实现),但是一个是faOneRecord,它只是将你要提取的fasta文件作为输入,然后是你想要查找的记录/ id,并返回fasta序列和标题:

faOneRecord <in.fa> <recordName>

所以,在第一个循环之后,我会根据id列表创建这个文件:

>1
ACGTCGAT
>2
TGTCAGTC

等等。

我认为这样做比较容易,但我似乎无法实现目标。然后,一旦我做了2个序列fasta,每个循环,我想对齐并获得距离估计,打印到文件并转到下一个循环。剩下的工作可能需要一些工作并且需要特定的程序,但是我需要帮助才能生成在id上提取/循环的2序列fasta。

我想主要的问题是如何循环id,然后将这些ID作为参数传递到faOneRecord命令

这可能太具体了,如果是这样,我道歉,但任何关于如何开始的想法都会有所帮助并且非常感激。

1 个答案:

答案 0 :(得分:1)

这是python解决方案的(不完整)草图。正如我在评论中所说,有两个步骤:

首先,读取数组中的两个文件。如果您确定它们与您的示例完全相同,则可以忽略>x行:

fasta1 = [''] # make sure the first item is saved to fasta1[1], not fasta[0]
for line in open('file1.fasta'):
    if not line.startswith('>'):
        fasta1.append(line.strip())

for line in open()只是打开文件并遍历其行。

对file2执行相同操作。然后,您可以交替读取list文件,获取数字并打印匹配的序列:

for l1, l2 in zip(open('file1.list'), open('file2.list')):
    print(fasta1[int(l1)])
    print(fasta2[int(l1)])

zip获取这两个文件并并行读取它们,这样第一次执行循环时,l1l2包含file1.list的第一行和file2.list分别;第二次,它是每个的第二行等等。