使用另一个文件中的文本替换一个文件中的文本

问题描述:

我需要从另一个文件(例如,'file2.fasta')更改为相应头文件的一个文件(例如'file1.fasta')中排序标头。注意:1)尽管file1.fasta有一些从file2.fasta反向补充的序列,但我希望不修改序列。 2)file1.fasta序列来自不同的来源,这意味着标题显示各种格式;我针对的只是几种格式的修改。使用另一个文件中的文本替换一个文件中的文本

下面是示例file2.fasta报头:

实施例的 所有各种报头格式在file1.fasta
>OFAS009268-RA-EXON07 |design:coreoidea-v1,designer:forthman,probes-locus:OFAS009268-RA-EXON07,probes-probe:,probes-source:Clavigralla_tomentosicollis_gi_512427643_gb_GAJX01006991.1 
CATTGCAGCAACTAACAGAGTTGATATATTAGATCCAGCCCTTCTCCGATCAGGCAGGCTAGACAGAAAAATTGAATTTCCTCATCCAAATGAAGATGCCCGTGCTCGAATTATGCAAAT 
>OFAS016134-RA-EXON02 |design:coreoidea-v1,designer:forthman,probes-locus:OFAS016134-RA-EXON02,probes-probe:,probes-source:Anasa_tristis_comp3229_c0_seq1 
AGGGCTTGTGATTCCCTTGAGCACATCGCAAGCCTCTGTTCTAGACAAAACATTCCACATTTGGTCAATAATGCTTTTGGTTTGCAAAGTGCACGTCTCATGCATTTAATTCAAGAGGCT 

(那些针对修改是前两个报头):

>Clavigralla_tomentosicollis_gi_512427643_gb_GAJX01006991.1_103_rc 
CATTGCAGCAACTAACAGAGTTGATATATTAGATCCAGCCCTTCTCCGATCAGGCAGGCTAGACAGAAAAATTGAATTTCCTCATCCAAATGAAGATGCCCGTGCTCGAATTATGCAAAT 
>Anasa_tristis_comp3229_c0_seq1_0_rc 
AGGGCTTGTGATTCCCTTGAGCACATCGCAAGCCTCTGTTCTAGACAAAACATTCCACATTTGGTCAATAATGCTTTTGGTTTGCAAAGTGCACGTCTCATGCATTTAATTCAAGAGGCT 
>ENSOFAS009761_p2 |design:coreoidea-v1,designer:forthman,probes-locus:ENSOFAS009761,probes-probe:2,probes-source:Anoplocnemis_curvipes_contig5129 
TTAAGAATCTCGAGAAAACCCCTCAGGATGATGAATTACTTGAAATATATGCTCTCTATAAACAAGCAACTGTAGGAGACTGTGACACAAGTAAGCCTGGGATGTTTGATTTCAAAGGGA1 
>uce-3225_p7 |design:hemiptera-v1,designer:faircloth,probes-locus:uce-3225,probes-probe:7,probes-source:halhal1,probes-global-chromo:Scaffold629,probes-global-start:410155,probes-global-end:410275,probes-local-start:0,probes-local-end:120 
AAATCCATCAAGAAATACCAACAACAACTTAAGGATGTCCAGACCGCACTCGAGGAAGAACAAAGAGCTAGGGATGATGCCCGAGAACAACTTGGTATTGCCGAAAGGCGAGCCAACGCT 
>Anasa_tristis_comp8051_c0_seq1_A_0 
ATCCTCCTGATTGGGCAGAAATTTTGAACCATTTTCGAGGGTCTGAACTTCAGAATTATTTTACAAAAATTTTGGAGGATGACCTTAAAGCCCTTATCAAGCCTCAGTATGTCGACCAAA 
>Anasa_tristis_comp8051_c0_seq1_B_0 
TAACGTCCTAGGTTAGGTTTCTGTTTACCAGCTAAAATCTTGAGGGCTGTAGACTTTCCAATGCCATTAGTTCCAACCAGACCTAAAACTTCTCCTGGTCTTGGAATTGGAAGTCTGTGG 

最后两个与目标类似,但有一个额外的下划线和一个字母。这些需要保持不变。任何以>uce>ENSOFAS开头的标题都应该单独保留。然后,新修改的file1.fasta文件应该是这样的:

>OFAS009268-RA-EXON07 |design:coreoidea-v1,designer:forthman,probes-locus:OFAS009268-RA-EXON07,probes-probe:,probes-source:Clavigralla_tomentosicollis_gi_512427643_gb_GAJX01006991.1_OFAS009268-RA-EXON07 
CATTGCAGCAACTAACAGAGTTGATATATTAGATCCAGCCCTTCTCCGATCAGGCAGGCTAGACAGAAAAATTGAATTTCCTCATCCAAATGAAGATGCCCGTGCTCGAATTATGCAAAT 
>OFAS016134-RA-EXON02 |design:coreoidea-v1,designer:forthman,probes-locus:OFAS016134-RA-EXON02,probes-probe:,probes-source:Anasa_tristis_comp3229_c0_seq1_OFAS016134-RA-EXON02 
AGGGCTTGTGATTCCCTTGAGCACATCGCAAGCCTCTGTTCTAGACAAAACATTCCACATTTGGTCAATAATGCTTTTGGTTTGCAAAGTGCACGTCTCATGCATTTAATTCAAGAGGCT 
>ENSOFAS009761_p2 |design:coreoidea-v1,designer:forthman,probes-locus:ENSOFAS009761,probes-probe:2,probes-source:Anoplocnemis_curvipes_contig5129 
TTAAGAATCTCGAGAAAACCCCTCAGGATGATGAATTACTTGAAATATATGCTCTCTATAAACAAGCAACTGTAGGAGACTGTGACACAAGTAAGCCTGGGATGTTTGATTTCAAAGGGA1 
>uce-3225_p7 |design:hemiptera-v1,designer:faircloth,probes-locus:uce-3225,probes-probe:7,probes-source:halhal1,probes-global-chromo:Scaffold629,probes-global-start:410155,probes-global-end:410275,probes-local-start:0,probes-local-end:120 
AAATCCATCAAGAAATACCAACAACAACTTAAGGATGTCCAGACCGCACTCGAGGAAGAACAAAGAGCTAGGGATGATGCCCGAGAACAACTTGGTATTGCCGAAAGGCGAGCCAACGCT 
>Anasa_tristis_comp8051_c0_seq1_A_0 
ATCCTCCTGATTGGGCAGAAATTTTGAACCATTTTCGAGGGTCTGAACTTCAGAATTATTTTACAAAAATTTTGGAGGATGACCTTAAAGCCCTTATCAAGCCTCAGTATGTCGACCAAA 
>Anasa_tristis_comp8051_c0_seq1_B_0 
TAACGTCCTAGGTTAGGTTTCTGTTTACCAGCTAAAATCTTGAGGGCTGTAGACTTTCCAATGCCATTAGTTCCAACCAGACCTAAAACTTCTCCTGGTCTTGGAATTGGAAGTCTGTGG 

我有一个python脚本有人前提是我用了类似的情况(但对于不同格式的头)。我对python语言并不熟悉,并且好奇这个脚本是否可以修改用于这个新目的。

#!/usr/bin/env python 

import sys 
import re 

original_fn = sys.argv[1] 
company_fn = sys.argv[2] 

pattern = '(uce | ENSOFAS | _[AB]_[0-9]+$)' 

map = {} 

with open(original_fn, "r") as original_fh: 
    for line in original_fh: 
     if line.startswith('>'): 
      try: 
       (k, v) = line.strip().split('|') 
       # remove trailing space from key 
       k = k[:-1] 
       map[k] = v 
      except ValueError as err: 
       k = line.strip() 
       map[k] = None 

with open(company_fn, "r") as company_fh: 
    for line in company_fh: 
     if line.startswith('>') and not re.search(pattern, line.strip()): 
      try: 
       (k, v) = line.strip().split('|') 
       # remove trailing character from key 
       k = k[:-1] 
      except ValueError as err: 
       k = line.strip() 
      if k not in map: 
       sys.stdout.write("%s\n" % (k)) 
      else: 
       sys.stdout.write("%s |%s\n" % (k, map[k])) 
     else: 
      sys.stdout.write("%s" % (line)) 
+0

请输入文件的一个例子,从输入文件的输出。目前,根据您提供的内容,虽然非常详细,但实际上很难看到您使用的是什么。 –

+0

我看不到我如何附加示例文件,但帖子中有这些示例。 –

+0

你是说,>收到标题并且遗传密码包含在同一个文件中。我不认为它很清楚,因此为什么没有人回答你迄今为止的答案。我认为它是正则表达式问题的一个很好的例子。 –

如果我现在明白你需要它只是下面的内容:

#!/usr/bin/env python 

import sys 

original_fn = sys.argv[1] 
company_fn = sys.argv[2] 

fpOriginal = open(original_fn, "r") 

for lineCompany in open(company_fn, "r").readlines(): 
    if lineCompany.startswith('*'): 
    sys.stdout.write(fpOriginal.readline()) 
    fpOriginal.readline() 
    else: 
    sys.stdout.write(lineCompany) 

fpOriginal.close() 
+0

这就近了。它只是按顺序从sys.argv [1]文件中拉出头文件,然后用这些顺序替换'*>'行。订单在文件之间不匹配。此外,作为背景,sys.argv [2]序列在sys.argv [1]文件中被“切碎”成较小的序列用于探针设计。因此,每个sys.argv [2]头文件应该至少替换两个相应的sys.argv [1]头文件。我希望这是有道理的。 –

+0

好的,订单不匹配,但两个文件中的遗传密码是相同的?如果是这样,我建议你一次读两行。将第二行作为字典的关键字,并将第一行作为值。然后,当您在替换时获得匹配项时,只需将file1.fasta作为值,键,值,键等读取,并将以*开头的任何值替换为file2.fasta字典中的值即可。它干净而且易于遵循。 –

+0

file1.fasta有一些从file2.fasta反向补充的序列,因此它们不完全相同。但是,我应该已经有一个脚本可以使用file2.fasta,它具有原始序列,并在file3.fasta输出中对它们进行反向补充。然后我可以'cat' file2.fasta和file3.fasta,所以它有两个序列链版本,然后可以用来匹配file1.fasta。但是,我仍然不知道如何修改脚本来执行此操作。我不熟悉python或其他编码语言。 –