【问题标题】:while loop with sed. Substitute matching pattern in one file with text from another带 sed 的 while 循环。用另一个文件中的文本替换一个文件中的匹配模式
【发布时间】:2021-03-28 05:20:58
【问题描述】:

我想将文本文件 (file1) 中的字符串添加到第二个文本文件 (file2)。 file1 中的字符串应在每个大于符号> 之后按顺序添加到 file2。 file2 中有 9 个大于符号,file1 中有 9 个字符串。 File1 在第 1 列的第 1-9 行包含 9 个不同的字符串。像这样:

...
sctC_
sctJ_
sctV_
...

这是我尝试将字符串添加到 file2 中的 sed 的 while 循环:

while IFS=$'\t' read  f1 f2  ; do sed "s/^>/&$f2/" ; done < <(paste  file2 file1)

但是,只有第一个字符串被添加到 file2 中,并且第一行从 file2 中删除:

MRNVLYAFLLTLYRGFCWSTVLLGMLPMAHAVTPPEWNKGAYAYSAEQTLLSTILIDFANSHGVELVMDN  sctJ_
LKDTLVEAKIRAETPAAFLDRLALEHRFQWFVYNHTLYVSSQDTQASIRLEISPDAAPDLKQALSGIGLL  sctV_
DPRFGWGELPEEGVVLVTGPQTYIDLIRNFSQQREKQDERRKVMIFPLRFASVSDRTLQYRDQRIVIPGV  sctN_
ATILSELMDGQRPPPTGASGPTDAVPDSAMEAMRENTRAMLTRLATRNNPARSTDENGRLVLNGRISADV  sctQ_
RNNALLVRDDEKRREEYQQLVEQIDVPQNLVNIDAIILDVDRTALSRLEANWQGTLGNVSAGSTMMMGRS  sctR_
TLFVSDFKRFFADIQALEGEGTASIVANPSVLTLENQPAIVDFSRTAFITATGERVAQIQPITAGTSLQV  sctS_
TPRVVGQDGPRSIQLVIDIEDGRVETGRDGEATGVKRGTVSTQALIGENRALVLGGFHVEESGDRDHRIP  sctT_
LLGDIPWLGRLFTSTRHEVSRRERLFILTPHLIGDQTDPTRYVSAENRHQINDVMNRVSQRNGKHDLYSL  sctU_
VENALRDLAGKQLPAGFQSETRGTRLSEVCRSQPGLVYDSNRYQWYGNGSIRLTVGVVRNSGTRIQRFDE  
SVCGSNRTLAVAAWPKTTLAPGESTEVFLALQTLSSTAPPRRSLLASY    
>sctC_12a_02741 hypothetical protein    
MKTDLRALFLLLSLLLMGCGDPIELNRGLSENDANEVIAALGRYQIAAEKRVDKTGVTLIIDAKNMERAV  
NILNAAGLPRQSRTNLGEVFQKSGVISTPLEERARYIYALSQEVEATLTQIDGVLVARVHVVLPERIAPG  
EPVQPASAAVFIKYQPELEPDSVEPRIRRMVASSIPGLSGKNDKDLSIVFVPAEPYQDTIPVVTLGPFTL  
TPQEMVRWQWTAGLMGALIIGLLAWRLGKPYMRQWQQNRADARQQR  
>sctC_12a_02750 Invasion protein InvA   
MNLVIIWLNRIALSAMQRSEVVGAVIVMSIVFMMIIPLPTSLIDVLIAFNICVSSLLIVLAMYLPKPLAF  
STFPAVLLLTTMFRLALSISTTRQILLQQDGGHIVEAFGNYVVGGNLAVGLVIFLILTVVNFLVITKGSE  
RVAEVAARFTLDAMPGKQMSIDSDLRAGLIEAHQARQRRDNLAKESQLFGAMDGAMKFVKGDAIAGLVIV  
FINMIGGFAIGVLQHGMSAADAMHVYSVLTIGDGLIAQIPALLISLTAGMIITRVSAEGQPLDANIGREI  
AEQLTSQPKAWIISALGMFGFALLPGMPSMVFMVISLASFSSGVFQLWRIKQQGILTHSQAEADNQPAEQ  
NGHQDLRRFNPTRAYLLQFHPSMQGNPATLSLVQHIRRLRNRLVYQFGMTLPSFDIEFSDRLDEDEFQFG  
VYEIPYVKATFVTERLAVHRSSFDQGELEDAIAGSTLRDEADWLWVSPMHPLLEQETCPRWAAGELILMR  
MENAIHRSGAQFIGLQETKSILTWLESEQPELAQELQRIMPLSRFAGVLQRLASERIPLRSVRPIAEALI  
EIGQHERDVHALTDYVRLALKAQICHQYSQQNTLHVWLLTPETEELLRDSLRQTQNETFFALTQDYAATL  
LGQLRRAFPPSLPSTGQILVAQDLRTPLRVLLQEEFHHVPVLSFSELESHLSINVLGRFDLYEENTPFSA  
>sctC_12a_02752 Type III secretion ATP synthase HrcN    
MQTQAAIDFPLMTRWFQQQRRRLSDFAPVDLKGRIIGISGILLECSLPRARIGDLCLVERQDGSQVMAEV  
VGFSPRNTFLSALGALDGIAQGAAVAPLYQPHCIQVSDRLFGSVLDGFGRALEDGGESAFVQPGELHGNA  
QPVLGDAPPPTARPRIATPLPTGLRAIDGLLTLGQGQRVGIFAGAGCGKTTLLAELARNTPCDAIVFGLI  
GERGRELREFLDHELDDDLRRRTVLVCSTSDRSSMERARAAFTATAIAEAYRAAGKQVLLIIDSLTRFAR  
AQREIGLALGEPQGRGGLPPSVYTLLPRLVERAGQTQTGAITALYSVLIEQDSMNDPVADEVRSLIDGHI  
VLTRRLAEQGHYPAIDVLASLSRTMSNVVDDGHNRHAGAVRRLMAAYKQVEMLIRLGEYQSGHDALTDSA  
VNAQQDITRFLRQAMRDPMAYDDIQQQLAEVSAHAP    

如何从 file1 获取字符串,在 file2 上的大于符号后递归添加?

谢谢,

京东

【问题讨论】:

    标签: sed while-loop fasta


    【解决方案1】:

    我不确定我是否完全理解您的要求,但 Perl 应该可以轻松处理这个问题。将第一个文件读入一个数组,然后遍历第二个文件并使用该数组添加缺失的信息。

    perl -we 'push @s, scalar <> until eof;
              chomp @s;
              s/(?<=^>)/shift @s/e, print while <>;
             ' file1 file2
    
    • &lt;&gt;readline 的较短版本,它从 scalar 上下文中的文件中读取一行。
    • eof 在文件耗尽时返回 true。
    • chomp 从数组中删除尾随换行符。
    • (?&lt;=...) 是一个lookbehind,在这种情况下,它匹配 after &gt; 在行首
    • 替换运算符s////e 修饰符将替换计算为代码,shift 从数组@s 中提取第一个元素

    【讨论】:

      猜你喜欢
      • 2021-04-02
      • 2013-06-17
      • 2011-06-03
      • 2018-03-29
      • 2019-02-20
      • 2013-06-23
      • 2013-06-23
      • 2013-01-10
      • 2019-03-06
      相关资源
      最近更新 更多