我想删除一行,如果它不以“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
答案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