根据列表中的新 ID 替换 fasta 文件的 seq ID

根据列表中的新 ID 替换 fasta 文件的 seq ID

我有一个 fasta 文件,我想用新的扩展 ID 替换 seq Id(描述行)。这是 fasta 文件的格式:

>3C-assembly|contig_74
TAATAAAAAATATTTTTTTAATTGACCCTAACCAAATCCTGAACCTAACCGTAACACTGA
>3C-assembly|contig_75
TAATAAAAAATATTTTTTTAATTGACCCTAACCAAATCCTGAACCTAACCGTAACACTGA
>3C-assembly|contig_76
TAATAAAAAATATTTTTTTAATTGACCCTAACCAAATCCTGAACCTAACCGTAACACTGA
...................

并希望实现以下格式的新 fasta:

>Scaffold_001 [Sex=Female] [Unplaced scaffold]
TAATAAAAAATATTTTTTTAATTGACCCTAACCAAATCCTGAACCTAACCGTAACACTGA
>Scaffold_002 [Sex=Female] [Unplaced scaffold]
TAATAAAAAATATTTTTTTAATTGACCCTAACCAAATCCTGAACCTAACCGTAACACTGA
>Scaffold_003 [Sex=Female] [Unplaced scaffold]
TAATAAAAAATATTTTTTTAATTGACCCTAACCAAATCCTGAACCTAACCGTAACACTGA
....................

这意味着,例如,3C-Assembly|contig_74 应替换为 Scaffold_001 [Sex=Female] [Unplacedscaffold]。为此,我构建了一个文本文件,其中包括连接这两个 IDS 的两列(制表符分隔):

3C-assembly|contig_74   Scaffold_001 [Sex=Female] [Unplaced scaffold]
3C-assembly|contig_75   Scaffold_002 [Sex=Female] [Unplaced scaffold]
3C-assembly|contig_76   Scaffold_003 [Sex=Female] [Unplaced scaffold]
......................

您知道如何使用此文本文件来替换 fasta 文件中的 ID。谢谢

答案1

使用awk

awk -F'\t' '
  NR==FNR{ a[$1]=$2; next }
  /^>/{ 
    id=a[substr($0, 2)]
    if (id!=""){ print ">" id; next }
  }
  1
' textfile file.fasta

首先,读取包含映射的文本文件,并a使用第一个字段作为索引将第二个字段保存在数组中。跳到next记录。

然后读取fasta文件。如果记录以 开头,则通过从当前记录 ( ) 中删除第一个字符并使用该值作为数组索引来>从数组中查找新的 id 。 如果 id 不为空,则打印id 并跳到该记录。substr($0, 2)
>next

打印1当前记录(序列或不匹配的 ID)。

答案2

awk -F'\t' '
    NR==FNR { map[">"$1] = ">"$2; next }
    $0 in map { $0 = map[$0] }
    { print }
' mapfile fastafile

相关内容