.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。
有更快的方法吗?
答案 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}}在命令的末尾)。