首页 > 解决方案 > 带 sed 的 while 循环。用另一个文件中的文本替换一个文件中的匹配模式

问题描述

我想将文本文件(file1)中的字符串添加到第二个文本文件(file2)。file1 中的字符串应在每个大于符号之后按顺序添加到 file2 >。file2 中有 9 个大于符号,file1 中有 9 个字符串。File1 在第 1 列的第 1-9 行包含 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中的字符串?

谢谢,

京东

标签: sedwhile-loopfasta

解决方案


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

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

推荐阅读