根据bash

时间:2015-10-08 08:18:01

标签: bash awk sed pipe fasta

我有一个(fasta)文件input.fa,看起来像这样

>coucou
GAGAGATAGTATAGATATATAGGATATATA
>hello_world
GATATATTCTCTCTGAFAGACGACGACFGACTACTACGAC
>ziva_wesh
HAHTAHTAHTAHCGAGAGACAGCAGCAGCACTTACTACATCHBACAHCAHCAHA

我想摆脱两者

>coucou
GAGAGATAGTATAGATATATAGGATATATA

>ziva_wesh
HAHTAHTAHTAHCGAGAGACAGCAGCAGCACTTACTACATCHBACAHCAHCAHA

我在做什么(基于@Hai Vu的this solution

$awk '/hello/{getline;next} 1' input.fa | awk '/coucou/{getline;next} 1'
>ziva_wesh
HAHTAHTAHTAHCGAGAGACAGCAGCAGCACTTACTACATCHBACAHCAHCAHA

有没有办法(使用awksedperl脚本)执行此操作,而无需将第一个awk结果“管道”到第二个awk命令? (像/hello&coucou/{getline;next} 1' input.fa

感谢您的回答!

3 个答案:

答案 0 :(得分:3)

一个简单的方法:

$ awk '/hello/{getline;next} /coucou/{getline;next} 1' input.fa 
>ziva_wesh
HAHTAHTAHTAHCGAGAGACAGCAGCAGCACTTACTACATCHBACAHCAHCAHA

或者如果您愿意:

$ awk '/(hello)|(coucou)/{getline;next} 1' input.fa 
>ziva_wesh
HAHTAHTAHTAHCGAGAGACAGCAGCAGCACTTACTACATCHBACAHCAHCAHA

答案 1 :(得分:3)

一个简单的sed命令也可以处理:

sed -nr '/>(hello|coucou)/{N;d};p' file
>ziva_wesh
HAHTAHTAHTAHCGAGAGACAGCAGCAGCACTTACTACATCHBACAHCAHCAHA

答案 2 :(得分:1)

这可能适合你(GNU sed):

sed -r '/>(coucou|ziva_wesh)/,+1d' file

这将删除2行的范围(包含>coucou>ziva_wesh的行与下一行的匹配。)