(交叉发布到Biostar:https://www.biostars.org/p/9562110/)

我有一个FASTA文件,我想在>之后的第一个位置添加‘similar to’

>_Anouracaudifer_00017283-RA transcript Name:"Similar to Chid1 Chitinase domain-containing protein 1 (Rattus norvegicus OX=10116)" offset:0 AED:0.30 eAED:0.30 QI:0|0|0|1|1|1|12|0|393
ATGAAGGCGCTCCTGCATGTGCTCTGGCTCACTCTGGCCTGCGGCTCTGCTCACACCACCCTGTCGAAGTCGGATGCCAAGAAGTCTGCCTCCAAGACACTGCAGGAGAAGACTCAGCTCTCAGAGACACCTGTGCAGGACCGGGGTCTGGTGGTAACAGACCCCCGAGCCGAGGACG

我希望输出是这样的

>Chid1_Anouracaudifer_00017283-RA transcript Name:"Similar to Chid1 Chitinase domain-containing protein 1 (Rattus norvegicus OX=10116)" offset:0 AED:0.30 eAED:0.30 QI:0|0|0|1|1|1|12|0|393
ATGAAGGCGCTCCTGCATGTGCTCTGGCTCACTCTGGCCTGCGGCTCTGCTCACACCACCCTGTCGAAGTCGGATGCCAAGAAGTCTGCCTCCAAGACACTGCAGGAGAAGACTCAGCTCTCAGAGACACCTGTGCAGGACCGGGGTCTGGTGGTAACAGACCCCCGAGCCGAGGACG

我该怎么做呢? 我已经试过了

sed -E 's/(Similar to )(\w+)/>CHIA_\2\1\2/' file.txt > new_file_2.txt

并将其存储在一个新文件中,并try 将其粘贴到标题中,但它不起作用,你有什么 idea 吗?

并且还使用了一个python脚本

def extract_similar_to_word(line):
    words = line.split()
    for i, word in enumerate(words):
        if word == "Similar":
            similar_to_word = words[i + 2].strip('""')
            if i + 3 < len(words) and words[i + 3].strip('""')[0].isupper():
                similar_to_word = words[i + 1].strip('""') + words[i + 2].strip('""')
            return similar_to_word
    return None

def modify_fasta_headers(input_file, output_file):
    with open(input_file, "r") as in_file, open(output_file, "w") as out_file:
        for line in in_file:
            if line.startswith(">"):
                similar_to_word = extract_similar_to_word(line)
                if similar_to_word:
                    # Find the first space in the line, then insert the similar_to_word
                    first_space_index = line.find(" ")
                    line = ">" + similar_to_word + "_" + line[1:first_space_index] + line[first_space_index:]
            out_file.write(line)



input_file = "all_chias.fasta"
output_file = "modified_output_fasta_v1.fasta"

modify_fasta_headers(input_file, output_file)

推荐答案

对于python,您可以使用Biopython SeqIO重命名文件:

from Bio import SeqIO

def extract_similar_to(line):
    data = line.split('Similar to ')
    if len(data) > 1:
        return data[1].split(' ')[0] + "_" + line
    else:
        return line

def modify_fasta_headers(input_file, output_file):
    with open(output_file, "w") as outputs:
        for r in SeqIO.parse(input_file, "fasta"):
            # Rewrite description with similar to word
            r.description = extract_similar_to(r.description)
            # Remove old id
            r.id = ''
            SeqIO.write(r, outputs, "fasta")


input_file = "all_chias.fasta"
output_file = "modified_output_fasta_v1.fasta"

modify_fasta_headers(input_file, output_file)

extract_similar_to()被重写,因此它用关键字Similar to来分割该行.对于您给出的示例:

>_Anouracaudifer_00017283-RA transcript Name:"Similar to Chid1 Chitinase domain-containing protein 1 (Rattus norvegicus OX=10116)" offset:0 AED:0.30 eAED:0.30 QI:0|0|0|1|1|1|12|0|393
ATGAAGGCGCTCCTGCATGTGCTCTGGCTCACTCTGGCCTGCGGCTCTGCTCACACCACCCTGTCGAAGTCGGATGCCAAGAAGTCTGCCTCCAAGACACTGCAGGAGAAGACTCAGCTCTCAGAGACACCTGTGCAGGACCGGGGTCTGGTGGTAACAGACCCCCGAGCCGAGGACG

data = line.split('Similar to ')行将返回以下内容:

['_Anouracaudifer_00017283-RA transcript Name:"', 'Chid1 Chitinase domain-containing protein 1 (Rattus norvegicus OX=10116)" offset:0 AED:0.30 eAED:0.30 QI:0|0|0|1|1|1|12|0|393']

因为名字中可能没有Similar to,所以我们判断返回的列表是否有length > 1.如果是,我们返回第二个列表元素中的第一个单词+原始行.否则,我们只返回原始行.

以下是modified_output_fasta_v1.fasta文件的内容:

> Chid1__Anouracaudifer_00017283-RA transcript Name:"Similar to Chid1 Chitinase domain-containing protein 1 (Rattus norvegicus OX=10116)" offset:0 AED:0.30 eAED:0.30 QI:0|0|0|1|1|1|12|0|393
ATGAAGGCGCTCCTGCATGTGCTCTGGCTCACTCTGGCCTGCGGCTCTGCTCACACCACC
CTGTCGAAGTCGGATGCCAAGAAGTCTGCCTCCAAGACACTGCAGGAGAAGACTCAGCTC
TCAGAGACACCTGTGCAGGACCGGGGTCTGGTGGTAACAGACCCCCGAGCCGAGGACG

Note:输出名称中出现双下划线的原因是因为您的示例已经包含下划线(我不确定这是否是故意的):

>_Anouracaudifer_00017283-RA ...

Python相关问答推荐

Python tkinter关闭第一个窗口,同时打开第二个窗口

有没有办法清除气流中的僵尸

Python在通过Inbox调用时给出不同的响应

为什么我的(工作)代码(生成交互式情节)在将其放入函数中时不再工作?

Flask主机持续 bootstrap 本地IP| Python

customtkinter中使用的这个小部件的名称是什么

Altair -箱形图边界设置为黑色,中线设置为红色

如何使用Tkinter创建两个高度相同的框架(顶部和底部)?

如何在Python中使用ijson解析SON期间检索文件位置?

在上下文管理器中更改异常类型

多处理代码在while循环中不工作

Pydantic 2.7.0模型接受字符串日期时间或无

如何检测背景有噪的图像中的正方形

计算每个IP的平均值

Asyncio:如何从子进程中读取stdout?

创建可序列化数据模型的最佳方法

在单个对象中解析多个Python数据帧

SQLAlchemy bindparam在mssql上失败(但在mysql上工作)

如何在Python中使用另一个数据框更改列值(列表)

try 检索blob名称列表时出现错误填充错误""