替换“>”的每个实例使用“> {InstanceNumber} _”

时间:2016-04-02 20:36:55

标签: parsing awk sed

.fasta文件的快速背景,从第一行开始的每一行都以>开头,之后我们有标题名称。文件中没有其他地方我们可以找到>。由于有时合并2个fasta文件会导致非唯一的标题名称,我想要一个简单的脚本,使每个标题名称都是唯一的。

我有:

for i in {1..4013}; do awk '/>/{c++;if(c=='"$i"'){sub(">",">'"$i"'_")}}1' Combined_Pass_2D_nanocorrect_round1_renamed.fasta > tmp.fasta; \ 
rm -rf Combined_Pass_2D_nanocorrect_round1_renamed.fasta; \ 
mv tmp.fasta Combined_Pass_2D_nanocorrect_round1_renamed.fasta; done

你可能猜到这需要很长时间,但它确实可以解决问题。我使用grep -c来查找标题数,并确定它是4013。

有更快的方法吗?

1 个答案:

答案 0 :(得分:5)

对于每次更换,您的方法都会通过整个fasta文件。对于这样的输入文件:

>header
ATGC
>another header
TACG
>and still another header
ATCG

您可以直接使用awk:

$ awk '/^>/{sub(/^>/, sprintf(">%04d_", ++i))}1' infile.fasta
>0001_header
ATGC
>0002_another header
TACG
>0003_and still another header
ATCG

我在数字上添加了零填充。如果您不想这样,则必须从04声明中删除sprintf

此命令只检查行是否以>开头,如果是,则递增计数器,将其追加到>,添加下划线并打印该行(孤行{{ 1}}在命令的末尾)。