首页 > 解决方案 > 在两个 > 符号之间保留行,保留第一个但不包括后续的

问题描述

我有一个这样的 DNA 文件,其中序列描述位于 > 符号之后的行上,序列位于下一行,直到下一个序列描述符 >。我想提取一个特定的序列(序列描述行+序列)而不保留下一个标识符行。

文件:

>k141_166416 flag=1 multi=2.0000 len=644
AAATAGTAAAACTCCAGAAGATGAATAATAAAAATCAGTCTCTAATATCTCATTTAATTGATCAGAAAAAATATTATTATAATCTAAATTTATTCTAGTATTTTTTAAAAATTGATTACTTAAGTCAAATTTAAAATAATCAACGATAATTCCTTTCTTCTCTTTCAAGTCAAAAGAAAAATCTCTATCAATATACTCTGAAGGATAAATTGTATAAAAATTCACAGACCAACCTTTAAAACATCTTATTTCAAAGTAGTACTTCTAAACAAGCATCTAGAGATACTACTTATTTTTGAATATTACTTACACTTTAACCATAAAAAAATTCTATAAAATACTCTATATCTAACAATACTTTTTCATTTATAAGAATTTTCTTTAACTCTTCTAAAAAACCTGTTTTATACCCTCCATTTTCACCTCTAGGGTTAGAGTCATATAGGTCAATAATTAAATTCTGCACAATATTAATTTGCGAAAAAAATCAAATAAATTTTTAGCAATGATATGTAATTCATCGCCTGAAATACATGCTCCTATCTCGCCACTATTATGATTAATGTATACGACATTTACATCATGCTGTGTTAAGAATACTGTAGTACTTTCCCCATCAAATATATCTTCAAACATATATTGAA
>k141_41604 flag=1 multi=2.0000 len=319
GGGCTCGTAGCCCATGGCCGGCTGCGTCAGGATGCGGCGCAGCTGCGCCATCACGCCCTGTGCTCGCTGGCGCGCGCGCATGAGCGGCCCGGTCAGGGGACCGCCGGCGGGCAGGTACATGCCGCCGCCCATGAATGACGCCGGCTGGCTGACGCGGCTGACCAGCTGCGTCGGCACGAAGCCGGCCTGGCGCGGCGCGCCGCTGTGGGAAAAACCGTAGCCGCTCGCAGGCGACCCCATGGGCCTGGAGGCGGGGCCGAGCGGCCCCGAGAGCGAGCCGGGGCCGGTGCCGTAGGGGCCCGATGCGTCCGGCCCCAGG
>k141_436839 flag=0 multi=1.0000 len=205
ATGAAATCACGATGTTTTTCTGATTCTACGAGTTAGGGAGAACATGAATCATCAGCTCTTTTTTAAATCTGGTGTTTGTCTGAGCCGGGAACCTCAGTTCTCAAAGGGCAGTTTTGCCATTGCGAGAATAGGCCATTTGAGCAATTGCGGTAATAGGCCGTTTCGGCCAAATTTCTTCTTGGTGTCACTCTTCAGGAAAAGAGAG
>k141_624048 flag=1 multi=3.0000 len=318
GTGCATAATCGCGGTATGGTGAAGGCCCGCTTCGACTTTTAGCGCCAACGCCAGCGCGCTATCAAAATCGCTGACTTTCACAATGGGCAGCATGGGCATCAGTTGTTCACACGTGACCCACGGATCTTCGGCATTCACCACCGCGATGAGCAGGCGAGGCGTTTTTGCCGGTGTTGCGATGTCTGATGCTTCCAGTAGCGTCGCCGGGCTCTTACCCACCAGTTTTTTATTCGCATGACCATCCTGTAGACAGACGGTACGTAATTTATCGGTGTCCGACGGGCTGAGAAGCAGCGCGCCAAACGCTTGCATCTGCTG
>k141_395237 flag=1 multi=4.0000 len=344
GCATACAATGGTGAGACTATGGTGGATCGACTAGATTGGGACAATGGTTTACTCGAAGGAACGGAAGTTTTAGGGCTGTTGAACTCGGCTCAAATTGTAGATATTCCATTTAAACCAAATGGACAATACGACCGAATTTCGATTGGACTGAAAAGCTTAATCCATGCGGATGTACTTTCGGCTATTGAAATCTACAAAGTAGAACGCGTATGTGATCTAATAGGATCTAACCAAAATTTAGTGTCGTGGAAGTCGTACAAAGTAAATGACGATGCTACTGTTACTTCGGTTTCAGGTGGTGAACAAGTGGAATATACCATCCATGTGAAAAATATAGGAACCAC

假设我希望将序列标识为>k141_436839,这样输出文件是:

>k141_436839 flag=0 multi=1.0000 len=205
ATGAAATCACGATGTTTTTCTGATTCTACGAGTTAGGGAGAACATGAATCATCAGCTCTTTTTTAAATCTGGTGTTTGTCTGAGCCGGGAACCTCAGTTCTCAAAGGGCAGTTTTGCCATTGCGAGAATAGGCCATTTGAGCAATTGCGGTAATAGGCCGTTTCGGCCAAATTTCTTCTTGGTGTCACTCTTCAGGAAAAGAGAG

关于类似问题的帖子表明了这一点,但没有奏效:sed -n -e '/^>k141_436839 $/,/^>$/{ /^>$/d; p; }'

长度len=也很重要。这是一个答案:

 awk '/^>/{f=/>k141_436839 flag=0 multi=1.0000 len=205/} f' file

标签: unixawksed

解决方案


$ awk '/^>/{f=/>k141_436839 /} f' file
>k141_436839 flag=0 multi=1.0000 len=205
ATGAAATCACGATGTTTTTCTGATTCTACGAGTTAGGGAGAACATGAATCATCAGCTCTTTTTTAAATCTGGTGTTTGTCTGAGCCGGGAACCTCAGTTCTCAAAGGGCAGTTTTGCCATTGCGAGAATAGGCCATTTGAGCAATTGCGGTAATAGGCCGTTTCGGCCAAATTTCTTCTTGGTGTCACTCTTCAGGAAAAGAGAG

请注意,无论每行之间有多少行,上面都会打印整个记录>,并且它将与任何 UNIX 机器上的任何 shell 中的任何 awk 一起使用。


推荐阅读