You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Fasta文件header中'Similar to'后词汇移至>后首位?

处理Fasta文件标题:提取"Similar to"后首词添加到标题开头

我有一个带注释的Fasta文件,需要将header中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命令:

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

    该命令逻辑错误,它是替换Similar to 单词的片段,而非在标题开头插入目标单词,因此无法得到预期结果。

  • 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:
                        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)
    

    脚本中存在判断逻辑错误(错误拼接了to和目标单词),且通过split()拆分文本会因引号导致单词识别不准确。

解决方案

方法1:使用sed命令

利用正则捕获标题开头部分和Similar to后的目标单词,重组标题:

sed -E 's/^>([^ ]+) (.*Similar to ([^ "]+).*)/>\3_\1 \2/' input.fasta > output.fasta
  • 正则说明:
    • ^>:匹配Fasta标题行的开头
    • ([^ ]+):捕获>后第一个空格前的所有内容(原标题的第一部分)
    • (.*Similar to ([^ "]+).*):捕获标题剩余内容,同时捕获Similar to后第一个非空格、非引号的单词
    • >\3_\1 \2:将捕获的目标单词放在最前面,加下划线后拼接原标题第一部分,最后接上剩余内容

方法2:修正后的Python脚本

使用正则精准匹配目标单词,避免拆分文本带来的问题:

import re

def modify_fasta_headers(input_file, output_file):
    # 正则匹配"Similar to"后的第一个目标单词(排除引号和空格)
    target_pattern = re.compile(r'Similar to ([^ "]+)')
    with open(input_file, 'r') as infile, open(output_file, 'w') as outfile:
        for line in infile:
            if line.startswith('>'):
                match_result = target_pattern.search(line)
                if match_result:
                    target_word = match_result.group(1)
                    # 找到第一个空格位置,插入目标单词
                    first_space_pos = line.find(' ')
                    if first_space_pos != -1:
                        new_header = f'>{target_word}_{line[1:first_space_pos]}{line[first_space_pos:]}'
                        outfile.write(new_header)
                        continue
            # 非标题行或匹配失败时直接写入原内容
            outfile.write(line)

# 替换为你的输入输出文件路径
input_file = "all_chias.fasta"
output_file = "modified_output_fasta_v1.fasta"

modify_fasta_headers(input_file, output_file)

内容的提问来源于stack exchange,提问作者Nadia Tamayo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 03:44:58