【问题标题】:Print lines after grep till next pattern在 grep 之后打印行直到下一个模式
【发布时间】:2020-08-14 18:40:28
【问题描述】:

我有一个格式为 (Input_fasta.txt) 的文件

>tr|A0A089QH62|A0A089QH62_MYCTU Histidine kinase OS=Mycobacterium tuberculosis (strain ATCC 25618 / H37Rv) GN=LH57_00865 PE=4 SV=1
MTATASGIAATAPNCGEASINDVPIAESERRYLGARSASEYGQEIPLW
>tr|I6WXB4|I6WXB4_MYCTU 30S ribosomal protein S6 OS=Mycobacterium tuberculosis (strain ATCC 25618 / H37Rv) GN=rpsF PE=3 SV=1
MRPYEIMVILDPTLDERTVAPSLETFLNVVRKDGGKVEKVDIWGKRRLAYEIAKHAEGIY
VVIDVKAAPATVSELDRQLSLNESVLRTKVMRTDKH
>tr|A0A089SBT4|A0A089SBT4_MYCTU Glycosyl transferase OS=Mycobacterium tuberculosis (strain ATCC 25618 / H37Rv) GN=LH57_19775 PE=4 SV=1
MDTETHYSDVWVVIPAFNEAAVIGKVVTDVRSVFDHVVCVDDGSTDGTGDIARRSGAHLV
RHPINLGQGAAIQTGIEYARKQPGAQVFATFDGDGQHRVKDVAAMVDRLGAGDVDVVIGT
RFGRPVGKASASRPPLMKRIVLQTGARLSRRGRRLGLTDTNNGLRVFNKTVADGLNITMS
GMSHATEFIMLIAENHWRVAEEPVEVLYTEYSKSKGQPLLNGVNIIFDGFLRGRMPR
>tr|A0A089QKT1|A0A089QKT1_MYCTU TetR family transcriptional regulator OS=Mycobacterium tuberculosis (strain ATCC 25618 / H37Rv) GN=LH57_00800 PE=4 SV=1
MSLTAGRGPGRPPAAKADETRKRILHAARQVFSERGYDGATFQEIAVRADLTRPAINHYF
ANKRVLYQEVVEQTHELVIVAGIERARREPTLMGRLAVVVDFAMEADAQYPASTAFLATT
VLESQRHPELSRTENDAVRATREFLVWAVNDAIERGELAADVDVSSLAETLLVVLCGVGF
YIGFVGSYQRMATITDSFQQLLAGTLWRPPT
>tr|I6YAB3|I6YAB3_MYCTU Iron ABC transporter permease OS=Mycobacterium tuberculosis (strain ATCC 25618 / H37Rv) GN=LH57_07380 PE=4 SV=1
MARGLQGVMLRSFGARDHTATVIETISIAPHFVRVRMVSPTLFQDAEAEPAAWLRFWFPD
PNGSNTEFQRAYTISEADPAAGRFAVDVVLHDPAGPASSWARTVKPGATIAVMSLMGSSR
FDVPEEQPAGYLLIGDSASIPGMNGIIETVPNDVPIEMYLEQHDDNDTLIPLAKHPRLRV
RWVMRRDEKSLAEAIENRDWSDWYAWATPEAAALKCVRVRLRDEFGFPKSEIHAQAYWNA
GRAMGTHRATEPAATEPEVGAAPQPESAVPAPARGSWRAQAASRLLAPLKLPLVLSGVLA
ALVTLAQLAPFVLLVELSRLLVSGAGAHRLFTVGFAAVGLLGTGALLAAALTLWLHVIDA
RFARALRLRLLSKLSRLPLGWFTSRGSGSIKKLVTDDTLALHYLVTHAVPDAVAAVVAPV
GVLVYLFVVDWRVALVLFGPVLVYLTITSSLTIQSGPRIVQAQRWAEKMNGEAGSYLEGQ
PVIRVFGAASSSFRRRLDEYIGFLVAWQRPLAGKKTLMDLATRPATFLWLIAATGTLLVA
THRMDPVNLLPFMFLGTTFGARLLGIAYGLGGLRTGLLAARHLQVTLDETELAVREHPRE
PLDGEAPATVVFDHVTFGYRPGVPVIQDVSLTLRPGTVTALVGPSGSGKSTLATLLARFH
DVERGAIRVGGQDIRSLAADELYTRVGFVLQEAQLVHGTAAENIALAVPDAPAEQVQVAA
REAQIHDRVLRLPDGYDTVLGANSGLSGGERQRLTIARAILGDTPVLILDEATAFADPES
EYLVQQALNRLTRDRTVLVIAHRLHTITRADQIVVLDHGRIVERGTHEELLAAGGRYCRL
WDTGQGSRVAVAAAQDGTR
>tr|L0T545|L0T545_MYCTU PPE family protein PPE7 OS=Mycobacterium tuberculosis (strain ATCC 25618 / H37Rv) GN=PPE7 PE=4 SV=1
MSVCVIYIPFKGCVKHVSVTIPITTEHLGPYEIDASTINPDQPIDTAFTQTLDFAGSGTV
GAFPFGFGWQQSPGFFNSTTTPSSGFFNSGAGGASGFLNDAAAAVSGLGNVFTETSGFFN
AGGVGIRASKTSATCCRAGRT

和另一个包含类似模式的文件(Pattern.txt)

I6WXB4

I6WXC3

I6WXK8

我需要像

这样的输出
>tr|I6WXB4|I6WXB4_MYCTU 30S ribosomal protein S6 OS=Mycobacterium tuberculosis (strain ATCC 25618 / H37Rv) GN=rpsF PE=3 SV=1
MRPYEIMVILDPTLDERTVAPSLETFLNVVRKDGGKVEKVDIWGKRRLAYEIAKHAEGIY
VVIDVKAAPATVSELDRQLSLNESVLRTKVMRTDKH

到目前为止我所做的是 grep -f Pattern.txt Input_fasta.txt

如何将输出扩展到下一行,直到我在比赛后点击下一个“>”?

试过awk '/I6WXB4/{copy=1;next} />/{copy=0;next} copy' Input_fasta.txt 它给出了一个输出

MRPYEIMVILDPTLDERTVAPSLETFLNVVRKDGGKVEKVDIWGKRRLAYEIAKHAEGIY VVIDVKAAPATVSELDRQLSLNESVLRTKVMRTDKH

但这里缺少标题。

【问题讨论】:

  • 这更像是 awk 或 python 的工作。如果这是最后一个元素怎么办?你永远找不到>
  • 幸运的是我的输入文件的最后一个元素不在我的模式文件中
  • 将其缩减为 6 行,每行少于 10 个字符,您会发现更多人有兴趣尝试理解它,以便他们为您提供帮助。

标签: r awk


【解决方案1】:

在 awk 中:

$ awk 'NR==FNR{a[$0]; next} $2 in a' pattern.txt FS="|" RS=">" input_fasta.tzt
tr|I6WXB4|I6WXB4_MYCTU 30S ribosomal protein S6 OS=Mycobacterium tuberculosis (strain ATCC 25618 / H37Rv) GN=rpsF PE=3 SV=1
MRPYEIMVILDPTLDERTVAPSLETFLNVVRKDGGKVEKVDIWGKRRLAYEIAKHAEGIY
VVIDVKAAPATVSELDRQLSLNESVLRTKVMRTDKH

【讨论】:

  • wrt 引号,这是避免意外的一个很好的经验法则:使用 's 引用,除非您需要使用 "s(例如扩展 shell 变量)并使用 " 引用s 直到您需要没有引号(例如用于通配符)。你会惊讶于我有多少次习惯使用" 而不是' :-(。
【解决方案2】:

这是一个简单的 Python 解决方案,使用 BioPython:

import sys
import re
from Bio import SeqIO

with open('pattern.txt', 'r') as f:
    patterns = '|'.join([re.escape(pattern.strip()) for pattern in f])

for record in SeqIO.parse('test.fa', 'fasta'):
    if re.search(patterns, record.id):
        SeqIO.write(record, sys.stdout, 'fasta')

请注意,这需要一个行为良好的 patterns.txt 文件,即不包含任何空行的文件。

【讨论】:

    【解决方案3】:

    bash & sed 解决方案:

    while read pattern
    do
    
    if [ ! -z $pattern ] ; then
    
     sed -n "/\|$pattern\|/{:loop;p;n;/>/q;bloop;}" input.txt
    fi
    
    done < patternfile.txt
    

    循环模式文件(跳过空白行),如果找到模式,只需读取并打印文件行直到找到&gt;

    【讨论】:

    • @EdMorton 您建议避免使用while 阅读什么内容? (文件中有一些模式)。这个例子有什么问题,因为pattern 是一组字母,所以没有正则表达式冲突的风险?在一般情况下,我同意你的看法(我会创建一个 python 脚本以获得最佳性能和安全性),但在这种简单的情况下,它工作得很好而且很快。
    • 具有高度净化输入的绝对最佳情况(这不是 - 你怎么知道有人不会在 input.txt 中添加像 tr|foo|foo_MYCTU 30S ribosomal protein (behaves like |I6WXB4|) 这样的描述性文本?),这将是一个顺序量级比 awk 脚本慢,写起来更长,更难理解,我猜是不可移植的。为此问“为什么不”就像是在说“我知道我旁边有一把电锯,但我可以用我的小刀砍掉这棵树,这有什么问题?”。
    • FWIW 如果您打算使用 sed 执行此操作,那么正确的 shell 代码将类似于 xargs -n 1 -I {} &lt; pattern.txt sed 'whatever' input.txt 但它仍然是错误的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多