grep(bash)多行模式

问题描述 投票:2回答:5

在bash(4.3.46(1))中,我有一些多行所谓的fasta记录,其中每条记录都是通过> name和以下行的DNA序列([AGCTNacgtn])启动的,这里有三条记录:

>chr1
AGCTACTTTT
AGGGNGGTNN
>chr2
TTGNACACCC
TGGGGGAGTA
>chr3
TGACGTGGGT
TCGGGTTTTT

如何使用bash grep获取第二条记录?在其他语言中,可以使用:

>chr2\n([AGCTNagctn]*\n)*

在Bash中,我试图使用来自here(以及其他SO)的想法。这不起作用:

grep -zo '>chr2[AGCTNacgtn]+' file 

结果应该是:

>chr2
TTGNACACCC
TGGGGGAGTA

在我的系统上,这是解决方案(下面是几乎Cyrus,即管道到第二个grep .):

grep -Pzo '>chr1\n[AGCTNacgtn\n]+' file
bash unix grep multiline
5个回答
3
投票

使用GNU grep:

grep -Pzo '>chr2\n[AGCTNacgtn\n]+' file | grep .

输出:

>chr2
TTGNACACCC
TGGGGGAGTA

2
投票

你可以使用awk和自定义RS

awk -v n=2 -v RS='(^|\n)>' 'NR==n+1{print ">" $0}' file    
>chr2
TTGNACACCC
TGGGGGAGTA

1
投票

你应该安装FAST perl包。它包含许多可直接从shell使用的实用程序,用于处理fasta文件,如fasheadfastail(和much more

安装后很简单:

fashead -n2 fastafile | fastail -n1

产量

>chr2
TTGNA.....

甚至更简单

fasgrep chr2 fastafile

具有相同的输出......


0
投票

试试这个 -

grep 'chr2' -A 2 file
>chr2
TTGNACACCC
TGGGGGAGTA

0
投票

使用多行记录的最佳工具是awk

在你的情况下:

awk 'BEGIN{RS=">"} NR==2 {print RS$0}' input.txt

input.txt

>chr1
AGCTACTTTT
AGGGNGGTNN
>chr2
TTGNACACCC
TGGGGGAGTA
>chr3
TGACGTGGGT
TCGGGTTTTT

Explanation:

BEGIN{RS=">"}最初将记录分隔符设置为">"

NR==2过滤器仅用于记录#2

{print RS$0}打印记录#2,缺少记录分隔符

© www.soinside.com 2019 - 2024. All rights reserved.