我有一个 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