2016-05-24 41 views
3

我有這個輸入文件:GSUB連續的字符,並保持前行

>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 

每個斷行之前,我想加入「>」線至極對應的字符串加上越來越多的(以是唯一的每個「> '線)。我一直在嘗試不同的方法,但沒有成功。

+0

如果必須重複,suq'計數將從1或3開始(其中'seq'計數停止)? –

回答

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.最後,我們全部更換INSERTNUMBER s的(1,2,...)

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 
+0

很好的解決方案! –

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