while 使用 sed 循环。用另一个文件中的文本替换一个文件中的匹配模式

while loop with sed. Substitute matching pattern in one file with text from another

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

...
sctC_
sctJ_
sctV_
...

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

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    

如何在 file2 的大于号之后递归地获取 file1 的字符串?

谢谢,

京东

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

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