#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