如果下一行以模式开头则删除该行

如果下一行以模式开头则删除该行

我想删除一行,如果它不以“a”“c”“t”或“g”开头,并且下一行以“>”开头。在以下示例中,“`>seq3”被删除。

输入:

>seq1
actgatgac
>seq2
ctgacgtca
>seq3
>seq4
gtagctagt
>seq5
tgacatgca

预期输出:

>seq1
actgatgac
>seq2
ctgacgtca
>seq4
gtagctagt
>seq5
tgacatgca

我尝试过使用 sed (sed '/^>.*/{$!N;/^>.*/!P;D}'sed '/^>/{$d;N;/^[aA;cC;gG;tT]/!D}') 但没有成功。

答案1

你可以尝试这样的事情:

$ sed -e '$!N;/^>.*\n>/D' -e 'P;D' file
>seq1
actgatgac
>seq2
ctgacgtca
>seq4
gtagctagt
>seq5
tgacatgca

那是

  • 维护一个两行缓冲区$!N...P;D
  • 寻找以换行符开头>>在换行符之后有另一个的模式
  • 删除直到换行符

答案2

一个 awk 的例子:

awk 'BEGIN {lasta="XXX"} {if ($0 !~ /^ *>/) printf("%s\n%s\n",lasta,$0);   lasta=$0;}'  fileNAME.txt

相当于

cat fileNAME.txt | awk 'BEGIN {lasta="XXX"} {if ($0 !~ /^ *>/) printf("%s\n%s\n",lasta,$0);   lasta=$0;}'

答案3

如果你有pcregrep安装后,你可以尝试:

pcregrep -M  '^>.*\n[^>]' file

解释

  • -M允许多行匹配
  • >查找以换行符开头和结尾的模式,后面不包含换行符>

答案4

尝试使用 awk 命令工作正常

awk '{a[++i]=$0}/^[actg]/{for(x=NR-1;x<=NR;x++)print a[x]}' file.txt

输出

>seq1
actgatgac
>seq2
ctgacgtca
>seq4
gtagctagt
>seq5
tgacatgca

相关内容