цикл while с sed. Замените соответствующий шаблон в одном файле текстом из другого

#sed #while-loop #fasta

#sed #цикл while #быстрая

Вопрос:

Я хотел бы добавить строку из текстового файла (file1) во второй текстовый файл (file2). Строки из file1 следует последовательно добавлять в file2 после каждого символа, превышающего символ > . В file2 есть 9 символов больше, чем в file1, и 9 строк. Файл1 содержит 9 разных строк в строках 1-9, в столбце 1. Вот так:

 ...
sctC_
sctJ_
sctV_
...
 

Это цикл while с sed, который я пытался добавить строку в file2:

 while IFS=

Однако в 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?

Спасибо,

JD

Ответ №1:

Я не уверен, что точно понимаю ваши требования, но Perl должен легко с этим справиться. Прочитайте первый файл в массив, затем выполните итерацию по второму и используйте массив для добавления недостающей информации.

 perl -we 'push @s, scalar <> until eof;
          chomp @s;
          s/(?<=^>)/shift @s/e, print while <>;
         ' file1 file2
 
  • <> это более короткая версия readline, она считывает строку из файла в скалярном контексте.
  • eof возвращает true, когда файл исчерпан.
  • chomp удаляет завершающие новые строки из массива.
  • (?<=...) это поиск сзади, в данном случае он совпадает после > в начале строки
  • /e модификатор оператора подстановки s/// оценивает замену как код, shift извлекает первый элемент из массива @s

t' read f1 f2 ; do sed "s/^>/amp;$f2/" ; done < <(paste file2 file1)
Однако в file2 добавляется только первая строка, а первая строка удаляется из file2:


Как я могу получить строку из file1, добавленную рекурсивно после символа больше, чем в file2?

Спасибо,

JD

Ответ №1:

Я не уверен, что точно понимаю ваши требования, но Perl должен легко с этим справиться. Прочитайте первый файл в массив, затем выполните итерацию по второму и используйте массив для добавления недостающей информации.


  • <> это более короткая версия readline, она считывает строку из файла в скалярном контексте.
  • eof возвращает true, когда файл исчерпан.
  • chomp удаляет завершающие новые строки из массива.
  • (?<=...) это поиск сзади, в данном случае он совпадает после > в начале строки
  • /e модификатор оператора подстановки s/// оценивает замену как код, shift извлекает первый элемент из массива @s