在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
使用GNU grep:
grep -Pzo '>chr2\n[AGCTNacgtn\n]+' file | grep .
输出:
>chr2 TTGNACACCC TGGGGGAGTA
你可以使用awk
和自定义RS
:
awk -v n=2 -v RS='(^|\n)>' 'NR==n+1{print ">" $0}' file
>chr2
TTGNACACCC
TGGGGGAGTA
试试这个 -
grep 'chr2' -A 2 file
>chr2
TTGNACACCC
TGGGGGAGTA
使用多行记录的最佳工具是awk
。
在你的情况下:
awk 'BEGIN{RS=">"} NR==2 {print RS$0}' input.txt
>chr1
AGCTACTTTT
AGGGNGGTNN
>chr2
TTGNACACCC
TGGGGGAGTA
>chr3
TGACGTGGGT
TCGGGTTTTT
BEGIN{RS=">"}
最初将记录分隔符设置为">"
NR==2
过滤器仅用于记录#2
{print RS$0}
打印记录#2,缺少记录分隔符