【问题标题】:Returning the position of pattern matches in a text file with multiple lines [closed]返回多行文本文件中模式匹配的位置[关闭]
【发布时间】:2021-09-27 10:29:34
【问题描述】:

我有一个格式如下的长文本文件:

>foo_bar
TATGTTCTGCAACTGTATAATGGTATAAAAACATTGCAAAATGTAATGAAACTTGTTATTTTGTGAAATACATTCTATAAATATCACTATTTCATGAAAA
ATATTGAAAATCATTTATTTTCGACAAGTAGAACCATAGGTTCTGTAATTGTAAATAGTTCTGCAAACTTAACCTGTTTTGCAGAAGAATATGTTTTCAC
TAGTTAACTTGTAGAATGTTTAGGATTGTTAAAATTTTTAACAAAATAAGATTTTATAGAACATGATTTGCAAAATAACACATTTTGCAATATTTTTATA
CCATATATAGTTGCAGAACATATGGGGACTACGGGCAGCCGGTAAATATGTGGACTACATGGAACTTGTTCAGATACATCTGGAGCAAAGAGCCACCGCT
CTAAATTATCTCTTCTCATTTCCAGTATTATATCTCTCATGCTAAATTATCTCTACAAATCATGACCTCTCTTAGCAATCTCCCTGAGCATCTCCGTAGG
GAGCAGATATTCACCCGTCTTCCGATGAAAGACCTAATGGTCCTCGCATCTGCAAGTCATGTCTTGCGTTAATCTTTCTCTCTCTTTTTGTGGAATCCCA
TCTCTCCTCTTATCAACTAAACCAGATACAGTTTGCACCAACTTTCTTCACTCCCCTGTTACATGAGAAGGCCAGACTTAGGTAGCTTCTGAATCAGAAC
CCGGTCATTCCAAGCATGGGATTTCTTGTTGATCTCTTGTTTTTATGTAATAGTGATCATTTGATATCTGGTGTTGATGGGAATTCAGATGTATGGGACT
TTGTTTATTGTTGATGTGGAATTCTTATATTTTACTGTGTACTATAAAATTTTAGTGATACCTACTATCTATTGTATAAATTGATTAATTGATGTTCTTA
>bar_foo
TATGTTCTGCAACTGTATAATGGTATAAAAACATTGCAAAATGTAATGAAACTTGTTATTTTGTGAAATACATTCTATAAATATCACTATTTCATGAAAA
ATATTGAAAATCATTTATTTTCGACAAGTAGAACCATAGGTTCTGTAATTGTAAATAGTTCTGCAAACTTAACCTGTTTTGCAGAAGAATATGTTTTCAC
TAGTTAACTTGTAGAATGTTTAGGATTGTTAAAATTTTTAACAAAATAAGATTTTATAGAACATGATTTGCAAAATAACACATTTTGCAATATTTTTATA
CCATATATAGTTGCAGAACATATGGGGACTACGGTACTACGGTAAATATGTGGACTACATGGAACTTGTTCAGATACATCTGGAGCAAAGAGCCACCGCT
CTAAATTATCTCTTCTCATTTCCAGCTGCATATCTCTCATGCTAAATTATCTCTACAAATCATGACCTCTCTTAGCAATCTCCCTGAGCATCTCCGTAGG
GAGCAGATATTCACCCGTCTTCCGATGAAAGACCTAATGGTCCTCGCATCTGCAAGTCATGTCTTGCGTTAATCTTTCTCTCTCTTTTTGTGGAATCCCA
TCTCTCCTCTTATCAACTAAACCAGATACAGTTTGCACCAACTTTCTTCACTCCCCTGTTACATGAGAAGGCCAGACTTAGGTAGCTTCTGAATCAGAAC
CCGGTCATTCCAAGCATGGGATTTCTTGTTGATCTCTTGTTTTTATGTAATAGTGATCATTTGATATCTGGTGTTGATGGGAATTCAGATGTATGGGACT
TTGTTTATTGTTGATGTGGAATTCTTATATTTTACTGTGTACTATAAAATTTTAGTGATACCTACTATCTATTGTATAAATTGATTAATTGATGTTCTTA

即,有一个以“>”开头的标题行,然后是任意数量的行,其中不超过 100 个字母。我想在非标题行中找到匹配“GCAGC”或“GCTGC”的位置。重叠的比赛地点都将被单独记录。

一个示例输出将是一个三列文本文件,其中第一列包含该文本块的标题行减去“>”,第二列包含模式匹配的开始位置(即数字文本块中的字符数,不包括换行符),第三列记录了两个模式中的哪一个匹配。例如:

foo_bar 109 GCAGC
bar_foo 58289 GCTGC

不确定这项任务有多复杂,尤其是是否有一种内存高效的方式来以流方式执行此操作。 awksed 似乎是两个可以工作的实用程序,但所需的命令超出了我对程序的有限理解。

【问题讨论】:

  • 您应该尝试将the answer you got yesterday 修改为一个几乎相同的问题,以便对其进行微小的更改。
  • the number of characters into the text block, excluding line-break characters - 我建议使用能够理解 fasta 格式的工具,例如:biopython 模块。

标签: awk sed grep


【解决方案1】:

yesterdays answer 的一个小调整:

sub(/^>/,"") {
    hdr = $0
    next
}
{
    while ( match($0,/GC[AT]GC/) ) {
        print hdr, RSTART, substr($0,RSTART,RLENGTH)
        $0 = substr($0,1,RSTART-1) " " substr($0,RSTART+1)
    }
}

请阅读 Arnold Robbins 的《Effective AWK Programming, 5th Edition》一书,了解 awk 的基础知识。

【讨论】:

    猜你喜欢
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-22
    • 2017-12-15
    • 2021-08-28
    • 1970-01-01
    相关资源
    最近更新 更多