Python 如何从fasta文件中删除重复项,但每个组基于头至少保留一个

Python 如何从fasta文件中删除重复项,但每个组基于头至少保留一个,python,fasta,Python,Fasta,我有一个multifasta文件,它看起来像这样: (所有序列均>100bp,多行,长度相同) 我需要删除重复项,但至少保留每个谱系的序列。因此,在上面这个简单的示例中(注意samplenameA、C和D是相同的),我只想删除samplenameD或samplenameC,但不想同时删除它们。最后,我希望获得与原始文件中相同的头信息 示例输出: >Lineage1_samplenameA CGCTTCAACGGAATGGATCTACGTTACAGCCTGCATAAAGAAAACGGAGTT

我有一个multifasta文件,它看起来像这样:

(所有序列均>100bp,多行,长度相同)

我需要删除重复项,但至少保留每个谱系的序列。因此,在上面这个简单的示例中(注意samplenameA、C和D是相同的),我只想删除samplenameD或samplenameC,但不想同时删除它们。最后,我希望获得与原始文件中相同的头信息

示例输出:

>Lineage1_samplenameA
CGCTTCAACGGAATGGATCTACGTTACAGCCTGCATAAAGAAAACGGAGTTGCCGAGGACGAAAGCGACTTTAGGTTCTGTCCGTTGTCTTTGGCGGAAA
>Lineage2_samplenameB
AAATTCAACGGAATGGATCTACGTTACAGCCTGCATAAAGAAAACGGAGTTGCCGAGGACGAAAGCGACTTTAGGTTCTGTCCGTTGTCTTTGGCGGAAG
>Lineage3_samplenameC
CGCTTCAACGGAATGGATCTACGTTACAGCCTGCATAAAGAAAACGGAGTTGCCGAGGACGAAAGCGACTTTAGGTTCTGTCCGTTGTCTTTGGCGGAAA
我找到了一种只删除重复项的方法。感谢皮埃尔·林登鲍姆

sed -e '/^>/s/$/@/' -e 's/^>/#/'
file.fasta  |\
tr -d '\n' | tr "#" "\n" | tr "@"
"\t" |\
sort -u -t '  ' -f -k 2,2  |\
sed -e 's/^/>/' -e 's/\t/\n/'
在上面的示例中运行此操作将导致:

>Lineage1_samplenameA
CGCTTCAACGGAATGGATCTACGTTACAGCCTGCATAAAGAAAACGGAGTTGCCGAGGACGAAAGCGACTTTAGGTTCTGTCCGTTGTCTTTGGCGGAAA
>Lineage2_samplenameB
AAATTCAACGGAATGGATCTACGTTACAGCCTGCATAAAGAAAACGGAGTTGCCGAGGACGAAAGCGACTTTAGGTTCTGTCCGTTGTCTTTGGCGGAAG
->所以失去了血统3序列

现在,我正在寻找一种快速解决方案,以删除重复项,但基于fasta头,每个谱系至少保留一个序列

我不熟悉脚本编写。。。欢迎使用bash/python/R中的任何想法


谢谢

在这种情况下,我可以看到两个相对较好的选择。A) 查看现有的工具(如Biopython库或FASTX工具包)。我认为它们都有很好的命令来完成大部分工作,因此可能值得学习它们。或者,B)编写自己的工具。在这种情况下,您可能需要尝试(我将坚持使用python):

逐行循环文件,并将沿袭/序列数据添加到字典中。我建议使用序列作为键。这样,您就可以很容易地知道是否已经遇到了此密钥

myfasta = {}
if myfasta[sequence]:
    myfasta[sequence].append(lineage_id)
else:
    myfasta[sequence] = [lineage_id]
这样,您的密钥(序列)将保存具有相同序列的沿袭ID列表。请注意,这个解决方案令人恼火的地方是在文件上循环,将沿袭id与序列分开,解释可能扩展到多行的序列,等等


之后,您可以在字典上循环,只使用字典列表中的第一个沿袭id将序列写入文件。

Hi,通常您编写的应该可以工作。您能更具体地说明您需要的解决方案吗?如果您提供的bash解决方案足够好,可以随意使用“回答您自己的问题”按钮。这将帮助将来的其他人找到解决方案:)对于将来的问题,如果可能的话,您可能希望避免使用特定的领域术语。这可能会使其他人更难提供帮助。祝你好运,欢迎你!:)@Ruslan谢谢,但我提供的解决方案删除了fasta文件中的所有重复序列。我不想那样。我想删除每个特定血统至少保留一个的重复项。删除重复序列时,可能会丢失整个谱系,因为它与其他谱系中的某些样本包含相同的序列。这样我就失去了很多有价值的信息。正如我在上面的问题/示例中所说,我不想同时删除C和D,因为我需要为血统3保留一个。我真的不知道还能怎么解释。。希望现在更清楚了。:)您是否可以编辑文章以提供示例所需的输出?我可以想出几种解决方案,但这实际上取决于您解决方案的性质:您的FASTA可以是多行吗?您是否需要保留任何血统信息,或者唯一的序列就足够了?等等,谢谢。我编辑了我的帖子。希望更清楚些嗨,Xela Vi,如果你发现我的答案有用,请考虑接受答案(点击旁边的“V”)。祝你好运!
myfasta = {}
if myfasta[sequence]:
    myfasta[sequence].append(lineage_id)
else:
    myfasta[sequence] = [lineage_id]