使用 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
我有多个从 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