Grep:返回匹配行加上以下N行到某个字符?

时间:2014-05-28 20:48:53

标签: bash grep fasta

我有一个文本文件,其格式如下:

>keyword1 keyword2 keyword3
somedata
somedata
somedata
>keyword4 keyword5 keyword6
somedata
somedata
>keyword7 keyword8
somedata
somedata
somedata
somedata
....

即,始终以">"开头的注释行然后是可变数量的数据行。

我想在开始的行中找一些东西">"并返回后面的所有数据行。如果之后总是有4行数据,我可以grep -A 4 '^>' keyword,但我不知道如何解释变化。

举个例子,如果文件是这样的:

>tomato lettuce cucumber
123
456
>apple banana
111
222
333
>tomato
444
5757
558585

我希望能够用"番茄"做一些类似grep的事情。并回来:

>tomato lettuce cucumber
123
456
>tomato
444
5757
558585

2 个答案:

答案 0 :(得分:1)

awk one-liner:

kent$  awk '/^>/{t=/tomato/?7:0}t' file  
>tomato lettuce cucumber
123
456
>tomato
444
5757
558585

答案 1 :(得分:0)

使用awk的另一种方式:

awk -v RS='>'  '/tomato/ {printf(">%s",$0)}' file
>tomato lettuce cucumber
123
456
>tomato
444
5757
558585

这会将记录分隔符RS从默认换行符更改为">"。如果记录中包含您感兴趣的单词,请将其打印出来。

如果您正在处理FASTA数据,您还有其他选择,例如BioPerl中的Bio::SeqIO模块。