【问题标题】:Rename FASTA files with part of their first line使用第一行的一部分重命名 FASTA 文件
【发布时间】:2016-10-27 02:31:42
【问题描述】:

我想使用第一行的一些信息重命名一些基因组 FASTA 文件,但我想不通。

这里是一个例子,两个文件:

GCA_000007365.1_ASM736v1_genomic.fna:

>AE013218.1 Buchnera aphidicola str. Sg (Schizaphis graminum), complete genome
ATGTCAAAGTCGTATTTAAAAAATTTTGATGTTATTGTTATTGGTGGAGGGCATGCTGGCACTGAAGCTGCAGCAGCCTC
TGCAAGAGTAGGTTGTAAAACATTATTATTAACTCAAAAAATAACTGATATAGGTGTATTATCTTGCAATCCTGCTATCG

GCA_000012065.2_ASM1206v2_genomic.fna:

>CP000048.1 Borrelia hermsii DAH, complete genome
TACCACTACACTTATTAATAATACATACTCACGCCTGGGGGGAAAAATTCAATAATGGAAACCTTACAAATATAAAACCA
CTACAAATAGGTATTATTCAGCATAATTATATAAATTTAACTCCTTATAATCAACATTATAAATATTACGCTTTCATTGG

我想用 FASTA 文件中第一行的信息重命名一千个 *.fna 文件,给出:

Buchnera_aphidicola_AE013218.1.fna
Borrelia_hermsii_CP000048.1.fna

FASTA 标头保持不变。只是文件名。

【问题讨论】:

  • 文件名中究竟是什么?前三个单词按顺序 2、3、1 没有>,用下划线连接?还有什么?
  • 正是@BenjaminW。单词 2, 3, 1 用 "_" (2_3_1) 分隔,不带“>”,仅此而已。

标签: bash fasta


【解决方案1】:

您可以遍历所有 .fna 文件,提取单词,用 awk 重新排列它们,然后将它们放入 mv 命令中,如下所示:

for fname in *.fna; do
    mv -- "$fname" \
    "$(awk 'NR==1{printf("%s_%s_%s\n",$2,$3,substr($1,2));exit}' "$fname")".fna
done

mv 命令之前添加echo 以查看其输出结果

mv -- GCA_000007365.1_ASM736v1_genomic.fna Buchnera_aphidicola_AE013218.1.fna
mv -- GCA_000012065.2_ASM1206v2_genomic.fna Borrelia_hermsii_CP000048.1.fna

-- 是为了确保以连字符开头的文件名不会被解释为mv 的选项。1

下面是命令替换中的 awk 命令的作用,更清晰:

NR == 1 {
    printf("%s_%s_%s\n", $2, $3, substr($1, 2))
    exit
}

printf 的格式化字符串重新排列了前三个单词; substr 从第一个单词中删除前导 >exit 阻止文件的其余部分被处理;它不会改变结果,但会减慢速度。


1 更便携的是mv "./$fname" "./$( ... )"-- 是 GNUism,据我所知。

【讨论】:

  • 太完美了!谢谢!
  • 你好@BenjaminW。问题是 $2 的开头带有一个空格(试图正确粘贴)' Buchnera_aphidicola_AE013218.1.fna'
  • @Tetraodienne 您是否正确添加了引号?如果您输入" $(awk ...)".fna 而不是"$(awk ...)".fna,则可能会发生这种情况,但我不知道还有其他方法。您生成的文件名以空格开头,对吗?
  • for fname in *.fna; do mv -- "$fname" \ "$(awk 'NR==1{printf("%s_%s_%s\n",$2,$3,substr($1,2));exit}' "$fname")".fna; done 我刚刚复制了你的。
  • @Tetraodienne 啊,我明白了。反斜杠只是用来逃避换行符以避免出现过长的行。您使用它的方式,它在文件名前转义了一个空格。如果在一行中使用该命令,则必须跳过反斜杠。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-02
  • 2020-01-29
  • 2010-11-26
  • 2011-12-03
  • 1970-01-01
  • 2017-10-25
相关资源
最近更新 更多