如何将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
相关产品推荐
相关产品推荐

