替换 fasta 中的名称

replace names in fasta

我想根据包含新名称的文本文件更改 fasta 文件中的序列名称。我找到了几种方法,但 seqkit 给我留下了很好的印象,无论如何我无法理解 运行。 Replace key with value by key-value file

fasta 文件 seq.fa 看起来像

>BC1
ATGCATGCATGCATGCATGCATGCATGCATGCATGCATGC
ATGCATGCATGCATGCATGCATGCATGCATGCATGCATGC
>BC2
TGCATGCATGCATGCATGCATGCATGCATGCATGCATGCG
GCATGCATGCATGCATGCATGCATGCATGCATGCG
>BC3
GCATGCATGCATGCATGCATGCATGCATGCATGCCCCCCC
TGCATGCATGCATG

ref.txt tab delimited 文本文件如

BC1 1234
BC2 1235
BC3 1236

Git Bash 中使用 siqkit 通过文件运行但不更改名称。

seqkit replace -p' (.+)$' -r' {kv}' -k ref.txt seq.fa --keep-key

我习惯了 rbash 的新手,找不到错误,但我想我需要针对 tab_ 进行调整? 如示例 https://bioinf.shenwei.me/seqkit/usage/#replace 第 7 部分。 Replace key with value by key-value file 序列名称以制表符分隔,仅替换第二部分。

请教如何调整代码?

期望的结果应该如下所示:用文本文件中的数字 1234

替换 BC1
>1234
ATGCATGCATGCATGCATGCATGCATGCATGCATGCATGC
ATGCATGCATGCATGCATGCATGCATGCATGCATGCATGC
>1235
TGCATGCATGCATGCATGCATGCATGCATGCATGCATGCG
GCATGCATGCATGCATGCATGCATGCATGCATGCG
>1236
GCATGCATGCATGCATGCATGCATGCATGCATGCCCCCCC
TGCATGCATGCATG

能否请您尝试以下。

awk '
FNR==NR{
  a[]=
  next
}
( in a) && /^>/{
  print ">"a[]
  next
}
1
' ref.txt FS="[> ]"  seq.fa

说明:为以上代码添加详细说明。

awk '                          ##Starting awk program here.
FNR==NR{                       ##FNR==NR is condition which will be TRUE when 1st Input_file named ref.txt will be read.
  a[]=                     ##Creating an array named a whose index is  and value is  of current line.
  next                         ##next will skip all further statements from here.
}                              ##Closing BLOCK for FNR==NR condition here.
( in a) && /^>/{             ##Checking condition if  of current line is present in array a and starts with > then do following.
  print ">"a[]               ##Printing > and value of array a whose index is .
  next                         ##next will skip all further statements from here.
}
1                              ##Mentioning 1 will print the lines(those which are NOT starting with > in Input_file seq.fa)
' ref.txt FS="[> ]"  seq.fa    ##Mentioning Input_file names here and setting FS= either space or > for Input_file seq.fa here.


编辑: 根据 OP 的评论,需要在输出中添加 >1234_1 出现次数,因此现在添加以下代码。

awk '
FNR==NR{
  a[]=
  b[]=++c[]
  next
}
( in a) && /^>/{
  print ">"a[]"_"b[]
  next
}
1
' ref.txt FS="[> ]"  seq.fa

不需要 GNU awk 的 awk 解决方案:

awk 'NR==FNR{a[]=;next}
     NF==2{=a[]; print ">" ;next}
     1' FS='\t' ref.txt FS='>' seq.fa

第一个语句是用制表符分隔文件 ref.txt.

的内容填充数组 a

第二个语句打印第二个文件 seq.fa 的所有行,其中包含 2 个字段,给定 > 作为字段分隔符。

最后一条语句打印同一文件的所有行。