我有两个包含多个序列的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
命令
这可能太具体了,如果是这样,我道歉,但任何关于如何开始的想法都会有所帮助并且非常感激。
答案 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
获取这两个文件并并行读取它们,这样第一次执行循环时,l1
和l2
包含file1.list
的第一行和file2.list
分别;第二次,它是每个的第二行等等。