【问题标题】:Remove multiple lines and following based on string in bash根据bash中的字符串删除多行并遵循
【发布时间】:2015-10-08 08:18:00
【问题描述】:

我有一个(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

感谢您的回答!

【问题讨论】:

  • 我没有测试 GNU grep 解决方案egrep -A1 -v "hello|coucou" input.fa,这行得通吗?
  • @Walter A 我的输出是:GAGAGATAGTATAGATATATAGGATATATA >hello_world GATATATTCTCTCTGAFAGACGACGACFGACTACTACGAC >ziva_wesh HAHTAHTAHTAHCGAGAGACAGCAGCAGCACTTACTACATCHBACAHCAHCAHA 所以它似乎只是删除了第一个出现的coucou

标签: bash awk sed pipe fasta


【解决方案1】:

一种简单的方法:

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

或者,如果您愿意:

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

【讨论】:

  • 太棒了!谢谢! :)
  • 如果你不想重复{getline;next},你可以像刚刚添加的第二个例子那样做一个复合正则表达式。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    这可能对你有用(GNU sed):

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-03
      • 2021-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-04
      • 1970-01-01
      相关资源
      最近更新 更多