【问题标题】:converting nexus to FASTA format将 nexus 转换为 FASTA 格式
【发布时间】:2015-12-19 03:31:49
【问题描述】:

我有许多 .nexus 文件,我想将它们转换为 FASTA 样式格式并合并为一个 .fasta 文件。这是一个示例代码:

for i in *.nexus;

do
 awk 'NR >5' /path/to/nexus_files/$i | tr -d "'" | tr " " "\n" | sed 's/locus/>locus/g' > /path/to/fasta/${i}.fasta
done

这适用于第一个 nexus 文件,但 #NEXUS 标头仍保留在后续转换中。

输入:

#NEXUS
begin data;
    dimensions ntax=1 nchar=300;
    format datatype=dna missing=? gap=-;
matrix
'locus1_individual-1' 
 ???????????????????????????????TAGATTTTTTAGTCCTTAC
;
end;

期望的输出:

>locus1_individual-1
???????????????????????????????TAGATTTTTTAGTCCTTAC

【问题讨论】:

  • 我看不出它只适用于第一个文件的原因。您确定第二个文件没有双标头或某些前导 cmets 或类似文件吗?
  • seqmagick 工具可能更灵活地进行转换,如下所述:biostars.org/p/79506/#98628
  • 您没有显示“组合”命令。

标签: shell awk type-conversion fasta


【解决方案1】:

为了加快速度,您可以减少所需的命令数量:

for i in *.nexus;
do
 awk 'NR>5 {gsub(f,"");gsub(/ /,"\n");gsub(/uce/,">&");print}' f="'" /path/to/nexus_files/$i > /path/to/fasta/${i}.fasta
done

来自 anishsane 的想法。 (多合一awk

awk 'FNR>5 {sub(/\.nexus$/,"",FILENAME);sub(/.*\//,"/path/to/fasta/",FILENAME);gsub(f,"");gsub(/ /,"\n");gsub(/uce/,">&");print >FILENAME".fasta"}' f="'" /path/to/nexus_files/*

第一个 sub 从文件名中删除 nexus 扩展名。
其次将路径改为/path/to/fasta/
现在使用FNR 很重要,因为您在一个awk 中读取了许多文件

【讨论】:

  • 您可以通过将打印语句输出重定向到 awk 本身内的 FILENAME ".fasta" 来进一步删除 bash 循环。 ;-)
  • @anishsane 这可能有效,但如您所见,您可能需要更改 FILENAME 一些
【解决方案2】:

试试:

for i in *.nexus;
do
 awk 'FNR >5' /path/to/nexus_files/$i | tr -d "'" | tr " " "\n" | sed 's/uce/>uce/g' > /path/to/fasta/${i}.fasta
done

NR 是跨文件的记录总数,FNR 是每个文件的记录数,新文件重置为零。

【讨论】:

  • 我不明白为什么这会有所不同... awk 正在分别针对单个文件运行。因此,如果每次运行时要 awk 的文件数始终为 1,那么NR==FNR,对吗?我错过了什么明显的东西吗?
  • @anishsane 你是对的。由于awk 每次对每个文件都从头开始,所以FNR 将等于NR。只有当您像这样运行awk 时,awk 'command' *awk 'command' file1 file2 file3 FNR 才会与NR 不同
猜你喜欢
  • 2012-08-31
  • 2022-12-05
  • 2015-07-22
  • 2020-12-18
  • 2020-09-15
  • 2016-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多