linux - sed l oop через список строк в файле - PullRequest
0 голосов
/ 03 марта 2020

У меня возникли проблемы с циклическим просмотром списка строк в файле A и использованием каждой строки для поиска совпадения в файле B, а затем для печати нескольких строк в файле B.

Вот как работает файл A выглядит как

Nitab4.5_0000062g0520.1

Nitab4.5_0000436g0070.1

Nitab4.5_0000375g0110.1

Так выглядит файл B

* *
1013 * Nitab4.5_0000062g0520.1 Зин * палец тысячу тридцать-пять, ССН C -типа, фибронектин-связывающий A, N-концевой домен, неизвестной функции DUF814, белок с неизвестной функцией DUF3441 MVKVRMNTADVAAEVKCLRRLIGMRCSNVYDLSPKTYVFKLMNSSGVTESGESEKVLLLM ESGVRLHTTDYLRDKSNTPSGFTLKLRKHIRTRRLEDVRQLGYDRIVLFQFGLGANAHYV ILELYAQGNILLTDSDFMVMTLLRSHRDDDKGLAIMSRHRYPVEICRVFKRTTTEKLQAA LMSSAETDKNEGVEDNEQGNDGSDALQQKQGNRKNIKATDSTKKMIDGVRAKSPTLKVVL GEALGYGPALSEHIILDAGLVPNAKIGKGFELEGEMLHSLIEAVKQFEDWLEDVILGEKV PEGYILMQQKALSKKDSSMCNNGASEKMYDEFCPLLLNQFKSRDFMKFEAFNAALDEFYS KIESQRSEQQQKAKESTAMQKLNKIRTDQENRVVTLKQEVEHCIKTAELIEYNLEDVDAA ILAVRVLVKZ AGLIDKLHLERNCMTLLLSNNLDEMDDDE KTQPVDKVEVDLALSAHANARRWYEMKKRQESKQEKTVTAHEKAFKAAERKTRLQLSQEK TVAVISHMRKVHWFEKFNWFVSSENYLVISGRDAQQNEMIVKRYMSKGDLYVHAELHGAS STVIKNHKPEMPIPPLTLNQAGCFTVCQSQAWDSKIVTSAWWVYPNQVSKTAPTGEYLTV GSFMIRGKKNFLPPHPLIMGFGILFRLDESSLGFHLNERRVRGEEEGLNDAEQSDPSLAI PDSDSEEELSMETSVDKDITDVPNDRSSVAGTSYEVQSNSLLSISDDKVTNSHNSSVKVN SINNDGLSDSLGIMATSGTSQLEDLIDRALEIGSSTASTKNHGVPPLLGSAGQQDNEEKK VTQREKPYITKAERRKLKKGSDSTEGAPARQEKQSEKNQKAQKQCDEDVNNSKSGGGKVI RGQKGKLKKIKEKYADQDEEERRIRMALLASAGKVEKVDQTIQSEKVDAEPDKGAKATTG PEDASKICYKCKKVGHLSRDCQENSDESLQSTANGGDGHSLTSAGNAANDRDRIVMEEED IHEIGEEEKEKLNDVDYLTGNPLPNDILLYAVPVCGPYNALQSYKYRVKLVPGTVKKGKA AKTAMNLFSHMPEATSREKELMKACTDPELVAAVKGNVKITSAGLTQLKQKQKKSKKSNK AES

Nitab4.5_0000375g0110.1 Tetratricopeptide типа, спирального прикрепления белка NSF, Tetratricopeptide повтора, малатдегидрогеназа, активный сайт, Tetratricopeptide повтор, содержащий домен MGDQIARGEEFEKKAEKKLSGWGLFGSKHDDAADLFDKAANCFKLAKSWDQAGAVYVKVA NCYLKLDSKHEAAGAYANAAHCYKKTNTREAISCLEQA VHMFLDIGRLNMSARYYKEIAE LYEQEQNLEQAIIYYEKAADLFQSEDVTTSANQCKQKIAQFSAELEKYQRAIEIFEEIAR HSVNNNLLKYGVRGHLLNAGICQLCKGDVVAINNALERYQELDPTFSGTRECKLLVDLAA AIDEEDVAKFTGSVKEYDSMTKLDALRTTLLLRVKEALKAKELEEDDLT

Nitab4.5_0000062g0530.1 ДНК-полимераза, пальмовый домен, ДНК-ДНК-полимеразы направлены, семейство В, сохраняющемся сайте, ДНК-ДНК-полимеразы направлены, семейство В, многофункциональном домене, ДНК-ДНК-полимеразы направлены , семейство В MARVTGVPISFLLARGQSIKVLSQLLRKARQRNLVIPNVKQAGSEQGTYEGATVLEARAG FYEKPIATLDFASLYPSIMMAYNLCYCTLVTPEEFHKLNLCEVDVNKTPSGEMFVKSDLQ KGILPEILEELLAARKRAKADLKEAKDPLVKAVLDGRQLALKISANSVYGFTGATVGQLP CLEISSSVTSYGRQMIEKTKKLVEDKFTVLKGYEHNAEVIYGDTDSVMVQFGVPTVEEAM KLGREAADHISETFIKPLRLEFEKIYYPYLLISKKRYAGLLWTNPDKHDKMDAKGELLAT * +1018 *

Nitab4.5_0005502g0010.1 Cdc6, C терминальный домен, Пли oop, содержащий нуклеозидтрифосфат гидролазу, деление клеток белок Cdc6 / 18, крылатая спираль-поворот-спираль ДНК-связывающий домен MPTIPVRRSPRISGGSKVAGQTVSRNEIGVSTPSKRKIRSDSTTEDNVVTSTLTPSPMEI SPCKWKSPRRCVNDSPKSPLNAN RGDKTINLSKSPVKRRLSESFLEKPIWNPRDMEQLNA VKEALHVSRAPSNLVCRQVEQNRVLEFCKQAVKIEKAGSLYVCGCPGTGKSLSMEKVKEV LVNWADESGFQAPDILSVNCTSLSNTSDIFGKMLDKIQPRRKLNCSTAPLQYLQKMFSEK QQPAGTKMLLIVADELDYLITKDKVVLHELFMLTTSPFSRFILIGIANAIDLADRFLPKL QSMNCEYFPSCKPAVITFCAYSKDQIISILQQRFEKVASASGDMRKALWVCRLVNIAARL ADHSLTKSAIEMLEAEIRDSISSLDLPSLHGRVSYQHRDGACDKSPIHESNVVRVDHVAI ALSKAYRSPVVDTIQSLPQHQQIILCSAVKLFRGKKKDATIGELNISYLDVCKSTLIPPV GIMELSSMCRVLGDQGILKVGKAREEKLSRVTLKVDEADITFALQA

Nitab4.5_0005502g0020.1 MVIEEQCDDEGVQPYIEQLMDGQNYSQAQTHDGQSNDFNNSADTEIQQNDDSGKTIDVQI NSRNQFIGKEGRKLASFLGIVARTPELTPLQCKKWD

* * 1023 Nitab4.5_0005502g0030.1 MINERLRNNSERLNDHPPQSVAWEGDVYSQVLKNKKSGYVRGNIDLEDSSNEVKRLEQKV IELTKLNGKQNEEMSSMKPELLWMRKVMCKIAPNELYMSQNINEISIGQVTQIQKFKTFV LKH

Nitab4.5_0005502g0040.1 рибосомного белка L10 / acidi c P0, рибосомальный белок L10 / L12 MAVKVTKAEKKVNYDKKLCKLLDTYQQILIVGADNVGSNQLQMIRKGLRGDSIVLMGKNT MMKRSIRIHAEKTGNNAFLALIPCLVGNVGLIFTRGDLKEVSDEVSKYKVGAPARVGLVA PIDVVVPPGNTGLDPSQTSFFQVLNIPTKINKGTVEITIPVEIIKKGEKVGSSESALLSK LGIKPFSYGLIVQFVYDSGSVFSPEVLDLTEDDLIAKFAAGLSNVVGLSMLLSYPTLAAI PHMFINGYKNVLSFAIATEYSFPQAEKVKEYLKDPSKFATAIAAPVATKPAVKPATAKEE KKEEPAEEDDDDFVGGLFD

Я хотел бы напечатать строки описания (строки, начинающиеся с> NitabXXXX) и следующие аминокислотные последовательности (заглавные буквы) в файле В, если идентификаторы генов (Nitab4 .5_xxxxx) были найдены в файле A. (В файле B аминокислотные последовательности были разделены на несколько строк)

Вот код, который я до сих пор придумал

while IFS= read -r Gene_ID; do sed -n '/$Gene_ID/,/>Nitab4.5/p' File B | sed '$d'; done < File A 

Код работал с указанным идентификатором гена и без l oop. Но я не смог заставить его работать после добавления l oop. Я новичок в Linux и сед. Надеюсь, кто-то мог указать на ошибку и помочь мне исправить код. Спасибо !!

Ответы [ 3 ]

0 голосов
/ 03 марта 2020

Сначала попробуем напечатать третью запись в FileB. (Я называю это FileB вместо File B, потому что пробелы в именах файлов являются большой головной болью.)

sed -n '/Nitab4.5_0000062g0530.1/,/>Nitab4.5/p' FileB
>Nitab4.5_0000062g0530.1 DNA polymerase, palm domain, DNA-directed DNA polymerase, family B, conserved site, DNA-directed DNA polymerase, family B, multifunctional domain, DNA-directed DNA polymerase, family B
MARVTGVPISFLLARGQSIKVLSQLLRKARQRNLVIPNVKQAGSEQGTYEGATVLEARAG
FYEKPIATLDFASLYPSIMMAYNLCYCTLVTPEEFHKLNLCEVDVNKTPSGEMFVKSDLQ
KGILPEILEELLAARKRAKADLKEAKDPLVKAVLDGRQLALKISANSVYGFTGATVGQLP
CLEISSSVTSYGRQMIEKTKKLVEDKFTVLKGYEHNAEVIYGDTDSVMVQFGVPTVEEAM
KLGREAADHISETFIKPLRLEFEKIYYPYLLISKKRYAGLLWTNPDKHDKMDAKGELLAT

>Nitab4.5_0005502g0010.1 CDC6, C-terminal domain, P-loop containing nucleoside triphosphate hydrolase, Cell division protein Cdc6/18, Winged helix-turn-helix DNA-binding domain

Это подняло первую строку следующей записи. Поэтому вместо завершения в "> Nitab4.5" давайте завершим в пустой строке:

sed -n '/Nitab4.5_0000062g0530.1/,/^$/p' FileB
>Nitab4.5_0000062g0530.1 DNA polymerase, palm domain, DNA-directed DNA polymerase, family B, conserved site, DNA-directed DNA polymerase, family B, multifunctional domain, DNA-directed DNA polymerase, family B
MARVTGVPISFLLARGQSIKVLSQLLRKARQRNLVIPNVKQAGSEQGTYEGATVLEARAG
FYEKPIATLDFASLYPSIMMAYNLCYCTLVTPEEFHKLNLCEVDVNKTPSGEMFVKSDLQ
KGILPEILEELLAARKRAKADLKEAKDPLVKAVLDGRQLALKISANSVYGFTGATVGQLP
CLEISSSVTSYGRQMIEKTKKLVEDKFTVLKGYEHNAEVIYGDTDSVMVQFGVPTVEEAM
KLGREAADHISETFIKPLRLEFEKIYYPYLLISKKRYAGLLWTNPDKHDKMDAKGELLAT

Теперь сделаем это с переменной:

line=Nitab4.5_0000062g0530.1; sed -n '/$line/,/^$/p' FileB

Мы ничего не получаем, потому что оболочка передала $line в sed, и у sed есть свои представления о том, что это значит. Чтобы оболочка расширила переменную перед передачей ее в sed, мы должны использовать двойные кавычки:

line=Nitab4.5_0000062g0530.1; sed -n "/$line/,/^$/p" FileB
>Nitab4.5_0000062g0530.1 DNA polymerase, palm domain, DNA-directed DNA polymerase, family B, conserved site, DNA-directed DNA polymerase, family B, multifunctional domain, DNA-directed DNA polymerase, family B
MARVTGVPISFLLARGQSIKVLSQLLRKARQRNLVIPNVKQAGSEQGTYEGATVLEARAG
FYEKPIATLDFASLYPSIMMAYNLCYCTLVTPEEFHKLNLCEVDVNKTPSGEMFVKSDLQ
KGILPEILEELLAARKRAKADLKEAKDPLVKAVLDGRQLALKISANSVYGFTGATVGQLP
CLEISSSVTSYGRQMIEKTKKLVEDKFTVLKGYEHNAEVIYGDTDSVMVQFGVPTVEEAM
KLGREAADHISETFIKPLRLEFEKIYYPYLLISKKRYAGLLWTNPDKHDKMDAKGELLAT

Если это удовлетворительно, мы можем начать с l oop. Всегда начинайте с чего-то простого:

while read line; do echo $line; done < FileA
Nitab4.5_0000062g0520.1

Nitab4.5_0000436g0070.1

Nitab4.5_0000375g0110.1

Эти пустые строки - это боль, поэтому давайте удалим их. Мы можем сделать это несколькими способами, но так как мы в любом случае используем sed, давайте используем sed:

sed '/^$/d' FileA | while read line; do echo $line; done
Nitab4.5_0000062g0520.1
Nitab4.5_0000436g0070.1
Nitab4.5_0000375g0110.1

Теперь мы собрали все вместе:

sed '/^$/d' FileA | while read line; do sed -n "/$line/,/^$/p" FileB; done 
0 голосов
/ 04 марта 2020

Спасибо за обновление вашего входного файла. Если вы выбрали awk, попробуйте следующее:

awk '
    BEGIN {RS=ORS="\n\n"; FS="\n"}
    NR==FNR {
        for (i=1; i<=NF; i++) nitab[$i]
        next
    }
    {
        if (match($1, /^>[^[:blank:]]+/)) {
            str = substr($1, 0, RLENGTH)
            if (str in nitab) print
        }
    }
' FileA FileB

Вывод:

>Nitab4.5_0000062g0520.1 Zinc finger, CCHC-type, Fibronectin-binding A, N-terminal, Domain of unknown function DUF814, Protein of unknown function DUF3441
MVKVRMNTADVAAEVKCLRRLIGMRCSNVYDLSPKTYVFKLMNSSGVTESGESEKVLLLM
ESGVRLHTTDYLRDKSNTPSGFTLKLRKHIRTRRLEDVRQLGYDRIVLFQFGLGANAHYV
ILELYAQGNILLTDSDFMVMTLLRSHRDDDKGLAIMSRHRYPVEICRVFKRTTTEKLQAA
LMSSAETDKNEGVEDNEQGNDGSDALQQKQGNRKNIKATDSTKKMIDGVRAKSPTLKVVL
GEALGYGPALSEHIILDAGLVPNAKIGKGFELEGEMLHSLIEAVKQFEDWLEDVILGEKV
PEGYILMQQKALSKKDSSMCNNGASEKMYDEFCPLLLNQFKSRDFMKFEAFNAALDEFYS
KIESQRSEQQQKAKESTAMQKLNKIRTDQENRVVTLKQEVEHCIKTAELIEYNLEDVDAA
ILAVRVALANGMSWEDLARMVKEEKRSGNPVAGLIDKLHLERNCMTLLLSNNLDEMDDDE
KTQPVDKVEVDLALSAHANARRWYEMKKRQESKQEKTVTAHEKAFKAAERKTRLQLSQEK
TVAVISHMRKVHWFEKFNWFVSSENYLVISGRDAQQNEMIVKRYMSKGDLYVHAELHGAS
STVIKNHKPEMPIPPLTLNQAGCFTVCQSQAWDSKIVTSAWWVYPNQVSKTAPTGEYLTV
GSFMIRGKKNFLPPHPLIMGFGILFRLDESSLGFHLNERRVRGEEEGLNDAEQSDPSLAI
PDSDSEEELSMETSVDKDITDVPNDRSSVAGTSYEVQSNSLLSISDDKVTNSHNSSVKVN
SINNDGLSDSLGIMATSGTSQLEDLIDRALEIGSSTASTKNHGVPPLLGSAGQQDNEEKK
VTQREKPYITKAERRKLKKGSDSTEGAPARQEKQSEKNQKAQKQCDEDVNNSKSGGGKVI
RGQKGKLKKIKEKYADQDEEERRIRMALLASAGKVEKVDQTIQSEKVDAEPDKGAKATTG
PEDASKICYKCKKVGHLSRDCQENSDESLQSTANGGDGHSLTSAGNAANDRDRIVMEEED
IHEIGEEEKEKLNDVDYLTGNPLPNDILLYAVPVCGPYNALQSYKYRVKLVPGTVKKGKA
AKTAMNLFSHMPEATSREKELMKACTDPELVAAVKGNVKITSAGLTQLKQKQKKSKKSNK
AES

>Nitab4.5_0000375g0110.1 Tetratricopeptide-like helical, NSF attachment protein, Tetratricopeptide repeat, Malate dehydrogenase, active site, Tetratricopepti
de repeat-containing domain
MGDQIARGEEFEKKAEKKLSGWGLFGSKHDDAADLFDKAANCFKLAKSWDQAGAVYVKVA
NCYLKLDSKHEAAGAYANAAHCYKKTNTREAISCLEQAVHMFLDIGRLNMSARYYKEIAE
LYEQEQNLEQAIIYYEKAADLFQSEDVTTSANQCKQKIAQFSAELEKYQRAIEIFEEIAR
HSVNNNLLKYGVRGHLLNAGICQLCKGDVVAINNALERYQELDPTFSGTRECKLLVDLAA
AIDEEDVAKFTGSVKEYDSMTKLDALRTTLLLRVKEALKAKELEEDDLT

[Пояснения]

  • Блок BEGIN назначает репараторы записи ввода / вывода двойным переводом строки, а разделитель полей - переводом строки. Он позволяет обрабатывать абзац (группу строки описания и строки аминокислот) как запись.
  • Условие FR==FNR возвращает TRUE при чтении 1-го файла только в списке аргументов (= FileA) , Эта идиома полезна для переключения процедуры в зависимости от входных файлов.
  • l oop for (i=1; i<=NF; i++) nitab[$i] сохраняет каждую строку FileA в массиве nitab.
  • Следующий оператор match($1, /^>[^[:blank:]]+/) извлекает подстроку >NitabXXX записанного в FileB, которая соответствует строкам FileA.
  • Тогда переменной str присваивается подстрока.
  • Если str соответствует любые записи массива nitab, затем распечатать запись.
0 голосов
/ 03 марта 2020

Ваш вопрос немного сбивает с толку, но может ли эта простая команда найти то, что вам нужно?

grep -f FILE_A -A 1 FILE_B

Опции делают следующее:

-f FILE
Получить шаблоны из FILE, по одному на строку. Пустой файл содержит ноль шаблонов и поэтому ничего не соответствует.
-A NUM
Печать NUM строк конечного контекста после сопоставления строк. Помещает строку, содержащую разделитель групп (описанный в разделе --group-separator) между смежными группами совпадений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...