根據清單中的新 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

相關內容