我有输入文件:
>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 :(得分: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