gsub连续字符并保留上一行

时间:2016-05-24 16:14:07

标签: awk

我有输入文件:

>seq
GATGGATTCGGANNNNNNNNNNNNNNNGTTGTAGGGNNNNNNNNNNNNNNNNNNNNNNGATAGAGAGNN
>suq
AAHAHAH

这个命令

awk '{gsub(/[N]{5,}/,"\n")}1' f.fa

当前输出

>seq
GATGGATTCGGA
GTTGTAGGG
GATAGAGAGNN
>suq
AAHAHAH

如果找到5个或更多个连续的'N'-s,则该字符串将被分成另一行。问题是我希望输出如下:

>seq
GATGGATTCGGA
>seq_1
GTTGTAGGG
>seq_2
GATAGAGAGNN
>suq
AAHAHAH

在每次换行之前,我想添加'>'对应于字符串加上增加的数字的行(为了使每个'>'行唯一)。我一直在尝试不同的方法但没有成功。

3 个答案:

答案 0 :(得分:2)

您已经完成了大部分工作。以下是我的补充:

 awk '$0~/^>/{prev=$0;}
      {gsub(/[N]{5,}/,"\n"prev"_INSERTNUMBER\n");
       for(counter=1;sub(/INSERTNUMBER/,counter++,$0)>0;){}}1' test

产生所需的输出

>seq
GATGGATTCGGA
>seq_1
GTTGTAGGG
>seq_2
GATAGAGAGNN
>suq
AAHAHAH

我添加了什么?
1.使用$0~/^>/{prev=$0;}我存储以>开头的上一行的内容 2.然后,我将[N]{5,}替换为\n上一个_INSERTNUMBER\n(即\n>seq_INSERTNUMBER\n
3.最后,我们用(1,2,...)

替换所有INSERTNUMBER s

答案 1 :(得分:2)

另一个awk

$ awk -v RS=">" 'NR>1{$0=RS $0; 
                      while(sub(/NNNNN+/, "\n" $1 "_" ++c "\n"));
                      printf "%s",$0}' file

>seq
GATGGATTCGGA
>seq_1
GTTGTAGGG
>seq_2
GATAGAGAGNN
>suq
AAHAHAH

答案 2 :(得分:1)

$ cat tst.awk
/^>/ { key = $0; next }
{
    split($0,a,/N{5,}/)
    for (i=1; i in a; i++) {
        print key (i>1 ? "_"i-1 : "") ORS a[i]
    }
}

$ awk -f tst.awk file
>seq
GATGGATTCGGA
>seq_1
GTTGTAGGG
>seq_2
GATAGAGAGNN
>suq
AAHAHAH