首页 文章

如何使用文件名重命名许多multi-fasta文件中的 Headers ?

提问于
浏览
2

我有一个包含数百个多FASTA文件的目录 . 这些文件使用物种或属的名称进行调用,例如:

Bubo_bubo.fasta
Poa_CC7849.fasta
Homo_sapiens.fasta
...

在每个文件中, Headers 由Trinity assembler自动生成,看起来与此示例类似:

>c5_g1_i1 len=168 path=[174:0-148 24:148-168]

我想重命名每个文件中的 Headers ,添加有关它来自的物种的信息 . 换句话说, Headers 应该在开头包含文件的名称 . 例如,如果上面的 Headers 来自 Bubo_bubo.fasta ,它应该如下所示:

>Bubu_bubo_c5_g1_i1 len=168 path=[174:0-148 24:148-168]

所以我想编写一个带有文件名的循环,并使用它在这个特定文件的每个fasta头中添加此信息,我想对目录中的所有文件执行此操作 .

1 回答

  • 2

    以下应该为您解决问题:

    awk '(FNR==1){f=FILENAME;sub(/\.[A-Za-z]*$/,"_",f)}
         /^>/{$0=">" f substr($0,2)}
         1' Bubo_bubo.fasta
    

    但是,这会将所有内容写入屏幕,您可能会对使用新文件感兴趣 . 所以你可以使用bash重定向多个文件:

    for f in *.fasta; do
       awk '(FNR==1){f=FILENAME;sub(/\.[A-Za-z]*$/,"_",f)}
            /^>/{$0=">" f substr($0,2)}
            1' "$f" > "/path/to/new/location/$(basename $f)"
    done
    

    如果你真的想要,你可以用awk本身做所有事情,这将是:

    awk '(FNR==1){                             # When a new file is opened (first record)
            close(fout);                       # close previous output file
            fout=FILENAME
            sub(".*/", "", fout)               # get basename of file
            f=fout                             # set f to basename of file
            fout="path/to/new/location/" fout  # prepend output directory
            sub(/\.[A-Za-z]*$/,"_",f)          # remove extention from f
         }
         /^>/{$0=">" f substr($0,2)}           # if header found, update it
         {print > fout}                        # print to output file
        ' *.fasta
    

相关问题