使用 fasta 重命名文件 header

Rename file using fasta header

我有多个从 NCBI 下载的 fasta 文件,想用 header 的某些部分重命名它们:

header 示例:>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 命令轻松完成。
任何建议将不胜感激

一种方法可以是:

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

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

如果您想重命名旧文件并更改其内容,
鉴于您的系统和 bash,我也认为它是 GNU awk 和 GNU sed,
请备份您的文件并尝试此操作:

#!/usr/bin/bash
for file in somefiles*; do
    nn="$(awk -F[\>.] '{printf  ".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  ".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