【问题标题】:Rename file using fasta header使用 fasta 标头重命名文件
【发布时间】:2019-01-11 16:22:16
【问题描述】:

我有多个从 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 命令轻松完成。
任何建议将不胜感激

【问题讨论】:

  • 不清楚,请在您的帖子中使用代码标签清楚地提及输入和预期输出示例。
  • 如果您将文件重命名为第一行的第一个空格和第一个逗号之间的任何内容,是否正确?
  • 是的,也更改标题并获得与文件相同的名称。我认为使用文件重命名第一个空格和第一个逗号之间的任何内容都可以。
  • @ RavinderSingh13例如 '> KY705281.1链球菌噬菌体P7955,完整基因组AGAAAGAAAAGACGGCTCATTTGTGGGTTGTCTTTTTTTGATTAAGTAATGAAGGAGGTGGATGTATTGG GCTAAATCAACGACAAAAACGATTTGCAGACGAATATTTGATATCTGGTGTCGCTTACAATGCAGCTATC AAAGCTGGGTATTCTGAGAAATACGCTAGAGCAAGAAGTCATACCTTGTTGGAAAATGTCGGCAT' 作为输入,并且 '>链球菌噬菌体P7955 AGAAAGAAAAGACGGCTCATTTGTGGGTTGTCTTTTTTTGATTAAGTAATGAAGGAGGTGGATGTATTGG GCTAAATCAACGACAAAAACGATTTGCAGACGAATATTTGATATCTGGTGTCGCTTACAATGCAGCTATC AAAGCTGGGTATTCTGAGAAATACGCTAGAGCAAGAAGTCATACCTTGTTGGAAAATGTCGGCAT' 作为输出预期跨度>
  • @FiestaJ 最好将此描述放在问题中并更好地格式化。我认为像这样的文件内容最好放在{}代码块格式下。

标签: awk sed grep fasta


【解决方案1】:

一种方法可能是:

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

【讨论】:

  • 嗨@Tiw,感谢您的提示,但它删除了文件中除第一行之外的所有其他行。我有 ubuntu 16.04 和 4.3.48 版本的 bash。
  • 所以对于 bash 脚本它给出了这个错误 awk: fatal: cannot open file file' for reading (No such file or directory). The oneliner works better but the ">" is missing. I have to run this to correct file format: sed -i '1s/^/>/' *.fasta`
  • @FiestaJ 哦,你的意思是第一个 > 被删除了,很抱歉。
  • 知道了,我会绕过代码来处理几乎相同的数据
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多