【问题标题】:Replacing each instance of ">" with ">{InstanceNumber}_"将“>”的每个实例替换为“>{InstanceNumber}_”
【发布时间】:2016-07-22 13:33:21
【问题描述】:

.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查找了headers的个数,确定是4013。

有没有更快的方法?

【问题讨论】:

  • 您能否添加相同的示例行,它们在转换前的外观以及转换后的外观?
  • 每次你写一个shell循环只是为了操作文本你有错误的方法。见unix.stackexchange.com/questions/169716/…

标签: parsing awk sed


【解决方案1】:

您的方法对每个替换都遍历整个 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

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

这个命令只是检查一行是否以>开头,如果是,它增加一个计数器,将它附加到>,添加一个下划线并打印该行(唯一的1在末尾命令)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 2016-02-13
    • 2021-01-02
    • 2021-07-24
    • 1970-01-01
    相关资源
    最近更新 更多