【问题标题】:search pattern from one file in another file and writing the line after the match into a third file从另一个文件中的一个文件搜索模式并将匹配后的行写入第三个文件
【发布时间】:2020-01-25 07:40:50
【问题描述】:

我想将一个文件的内容搜索到另一个文件中并打印匹配的行和第二个文件中匹配行之后的行。第一个文件的内容可以在第二个文件的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 中的字符串并且我想打印所有这些匹配项怎么办?

提前致谢

【问题讨论】:

    标签: search awk grep


    【解决方案1】:

    如果你有GNU grep

    grep --no-group-separator -A1 -Ff file1 file2
    
    • -A1 将告诉 grep 打印匹配的行以及下一行
    • 默认情况下,输出组将由--分隔,因此如果您希望避免使用此行,请使用--no-group-separator

    【讨论】:

    • 感谢它的工作。如果我想打印> 之后的所有行,直到遇到另一个> 并且其间的行数不同,比如 4、5 或 6,怎么样?
    • @codeblaze 很抱歉回复晚了...awk 'NR==FNR{a[$1]; next} /^>/{f=0; for(k in a) if($0 ~ k) f=1} f' file1 file2 之类的东西可能有效(尚未测试过)...如果我猜对了这是与生物信息学相关的,我' d 建议bioinformatics.stackexchange.com 更适合你
    【解决方案2】:

    请您尝试关注一下。

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-28
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多