поиск шаблона из одного файла в другом файле и запись строки после совпадения в третий файл - PullRequest
1 голос
/ 25 сентября 2019

Я хочу найти содержимое одного файла в другом файле и распечатать совпадающую строку и строку, которая следует за совпадающей строкой из второго файла.Содержимое первого файла можно найти в строках, начинающихся с > в столбце GN во втором файле.Я хочу написать строку, которая соответствует (начиная с >), за которой следует строка после той, которая имеет последовательность аминокислот (строка заглавных букв, начинающихся с "M" )

Файл 1:

thrB
yaaX
thrC
dnaK
dnaJ

Файл 2:

>sp|B1XBC8|KHSE_ECODH Homoserine kinase OS=Escherichia coli (strain K12 / DH10B) OX=316385 GN=thrB PE=3 SV=1
MVKVYAPASSANMSVGFDVLGAAVTPVDGALLGDVVTVEAAETFSLNNLGRFADKLPSEP
>sp|P0AD61|KPYK1_ECOLI Pyruvate kinase I OS=Escherichia coli (strain K12) OX=83333 GN=pykF PE=1 SV=1
MKKTKIVCTIGPKTESEEMLAKMLDAGMNVMRLNFSHGDYAEHGQRIQNLRNVMSKTGKT
>sp|P75616|YAAX_ECOLI Uncharacterized protein YaaX OS=Escherichia coli (strain K12) OX=83333 GN=yaaX PE=3 SV=1
MKKMQSIVLALSLVLVAPMAAQAAEITLVPSVKLQIGDRDNRGYYWDGGHWRDHGWWKQH

, и я ожидаю вывод:

>sp|B1XBC8|KHSE_ECODH Homoserine kinase OS=Escherichia coli (strain K12 / DH10B) OX=316385 GN=thrB PE=3 SV=1
MVKVYAPASSANMSVGFDVLGAAVTPVDGALLGDVVTVEAAETFSLNNLGRFADKLPSEP
>sp|P75616|YAAX_ECOLI Uncharacterized protein YaaX OS=Escherichia coli (strain K12) OX=83333 GN=yaaX PE=3 SV=1
MKKMQSIVLALSLVLVAPMAAQAAEITLVPSVKLQIGDRDNRGYYWDGGHWRDHGWWKQH

До сих пор я пытался grep -F -f file1 file2, которыйпечатает только строку с найденным соответствием

с помощью awk. Я только написал awk 'NR==FNR{a[$1]++;next}{} file1 file2 Я могу напечатать соответствующую строку, но не знаю, как напечатать строку после этого (начиная с «M»).

Может ли кто-нибудь помочь мне пройти через это?

Буду очень признателен за вашу помощь.

Кроме того, что если в моем втором файле есть несколько совпадений строки вфайл 1, и я хочу напечатать все такие случаи?

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 25 сентября 2019

Если у вас есть GNU grep

grep --no-group-separator -A1 -Ff file1 file2
  • -A1, то скажет grep напечатать соответствующую строку, а также следующую строку
  • по умолчанию, группы выводабудет разделен --, поэтому используйте --no-group-separator, если хотите избежать этой строки
0 голосов
/ 25 сентября 2019

Не могли бы вы попробовать следующее.

awk '
FNR==NR{
  a[$0]
  next
}
match($0,/GN=[^ ]*/){
  str=substr($0,RSTART+3,RLENGTH-3)
}
(str in a) && /^>/{
  found=1
  val=$0
  next
}
found && /^M/{
  print val ORS $0
}
{
  val=found=""
}
'  Input_file1  Input_file2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...