使用Fasta标头重命名文件

时间:2019-01-11 16:22:16

标签: awk sed grep fasta

我从NCBI下载了多个fasta文件,并想用标题的一部分重命名它们:

标题示例:>KY705281.1 Streptococcus phage P7955, complete genome
文件名示例:KY705281.fasta

我们的想法是摆脱'KY705281.1''complete genome'以便仅保留链球菌噬菌体P7955

例如,一个输入文件将是:

>KY705281.1 Streptococcus phage P7955, complete genome
AGAAAGAAAAGACGGCTCATTTGTGGGTTGTCTTTTTTTGATTAAGTAATGAAGGAGGTGGATGTATTGG GCTAAATCAACGACAAAAACGATTTGCAGACGAATATTTGATATCTGGTGTCGCTTACAATGCAGCTATC AAAGCTGGGTATTCTGAGAAATACGCTAGAGCAAGAAGTCATACCTTGTTGGAAAATGTCGGCAT

将其内容重命名为KY705281.fasta

>Streptococcus phage P7955 
AGAAAGAAAAGACGGCTCATTTGTGGGTTGTCTTTTTTTGATTAAGTAATGAAGGAGGTGGATGTATTGG GCTAAATCAACGACAAAAACGATTTGCAGACGAATATTTGATATCTGGTGTCGCTTACAATGCAGCTATC AAAGCTGGGTATTCTGAGAAATACGCTAGAGCAAGAAGTCATACCTTGTTGGAAAATGTCGGCAT

我是Linux的新手,但是以某种方式通过Google搜索,我知道可以使用一些awk / sed / grep命令轻松完成此操作。
任何建议将不胜感激

1 个答案:

答案 0 :(得分:0)

一种方法可能是:

awk -F, 'FNR==1{match($1, "^>([^.]+)[^ ]+ (.*)", oFv); $1= ">" oFv[2]; sub(/ *complete genome */, "", $2);}{printf $0>oFv[1] ".fasta"}' somefiles*

这将保留旧文件并写入相应的新文件。
同样,这假设输入文件只有一行,就像您给的那样。

如果您想重命名旧文件并更改其内容,
考虑到您的系统和bash,我也认为是GNU awk和GNU sed,
请备份您的文件,然后尝试以下操作:

#!/usr/bin/bash
for file in somefiles*; do
    nn="$(awk -F[\>.] '{printf $2 ".fasta";exit}' "file")"
    sed -ri '1{s/^[^ ]* />/;s/, complete genome//;}' "file"
    if [ ! -f "$nn"];
    then
        mv "file" "nn"
    else
        echo "'$nn' exists, skip '$file', its content already changed." | tee _err_.log
    fi
done

或作为一个班轮:

for file in somefiles*; do nn="$(awk -F[\>.] '{printf $2 ".fasta";exit}' "$file")"; sed -ri '1{s/^[^ ]* />/;s/, complete genome//;}' "$file"; if [ ! -f "$nn" ]; then mv "$file" "$nn"; else echo "'$nn' exists, skip '$file', its content already changed." | tee _err_.log; fi; done