Bash 在fasta中替换名称

Bash 在fasta中替换名称,bash,awk,replace,fasta,Bash,Awk,Replace,Fasta,我想根据包含新名称的文本文件更改fasta文件中的序列名称。我找到了几种方法,但是seqkit给我留下了很好的印象,无论如何我都无法让它运行按键值文件将键替换为值 fasta文件seq.fa如下所示 >BC1 ATGCATGCATGCATGCATGCATGCATGCATGCATGCATGC ATGCATGCATGCATGCATGCATGCATGCATGCATGCATGC >BC2 TGCATGCATGCATGCATGCATGCATGCATGCATGCATGCG GCATGCATGCA

我想根据包含新名称的文本文件更改fasta文件中的序列名称。我找到了几种方法,但是
seqkit
给我留下了很好的印象,无论如何我都无法让它运行<代码>按键值文件将键替换为值

fasta文件
seq.fa
如下所示

>BC1
ATGCATGCATGCATGCATGCATGCATGCATGCATGCATGC
ATGCATGCATGCATGCATGCATGCATGCATGCATGCATGC
>BC2
TGCATGCATGCATGCATGCATGCATGCATGCATGCATGCG
GCATGCATGCATGCATGCATGCATGCATGCATGCG
>BC3
GCATGCATGCATGCATGCATGCATGCATGCATGCCCCCCC
TGCATGCATGCATG
ref.txt
选项卡分隔的
文本文件,如

BC1 1234
BC2 1235
BC3 1236
gitbash
中使用
siqkit
会在文件中运行,但不会更改名称

seqkit replace -p' (.+)$' -r' {kv}' -k ref.txt seq.fa --keep-key
我习惯了
r
bash
的新手,但我找不到bug,但我想我需要调整
选项卡和
?
如示例第7部分所示<代码>按键值替换键值文件
序列名称以制表符分隔,仅替换第二部分

建议如何调整代码

期望的结果应该如下所示:将
BC1
替换为文本文件
1234

>1234
ATGCATGCATGCATGCATGCATGCATGCATGCATGCATGC
ATGCATGCATGCATGCATGCATGCATGCATGCATGCATGC
>1235
TGCATGCATGCATGCATGCATGCATGCATGCATGCATGCG
GCATGCATGCATGCATGCATGCATGCATGCATGCG
>1236
GCATGCATGCATGCATGCATGCATGCATGCATGCCCCCCC
TGCATGCATGCATG

你能试试下面的吗

awk '
FNR==NR{
  a[$1]=$2
  next
}
($2 in a) && /^>/{
  print ">"a[$2]
  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[$1]=$2                     ##Creating an array named a whose index is $1 and value is $2 of current line.
  next                         ##next will skip all further statements from here.
}                              ##Closing BLOCK for FNR==NR condition here.
($2 in a) && /^>/{             ##Checking condition if $2 of current line is present in array a and starts with > then do following.
  print ">"a[$2]               ##Printing > and value of array a whose index is $2.
  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\u 1
出现次数,因此现在添加以下代码

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

你能试试下面的吗

awk '
FNR==NR{
  a[$1]=$2
  next
}
($2 in a) && /^>/{
  print ">"a[$2]
  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[$1]=$2                     ##Creating an array named a whose index is $1 and value is $2 of current line.
  next                         ##next will skip all further statements from here.
}                              ##Closing BLOCK for FNR==NR condition here.
($2 in a) && /^>/{             ##Checking condition if $2 of current line is present in array a and starts with > then do following.
  print ">"a[$2]               ##Printing > and value of array a whose index is $2.
  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\u 1
出现次数,因此现在添加以下代码

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

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

awk 'NR==FNR{a[$1]=$2;next}
     NF==2{$2=a[$2]; print ">" $2;next}
     1' FS='\t' ref.txt FS='>' seq.fa
第一条语句用制表符分隔的文件
ref.txt
的内容填充数组
a

第二条语句打印第二个文件
seq.fa
的所有行,其中两个字段以
作为字段分隔符


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

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

awk 'NR==FNR{a[$1]=$2;next}
     NF==2{$2=a[$2]; print ">" $2;next}
     1' FS='\t' ref.txt FS='>' seq.fa
第一条语句用制表符分隔的文件
ref.txt
的内容填充数组
a

第二条语句打印第二个文件
seq.fa
的所有行,其中两个字段以
作为字段分隔符


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

nice<代码>awk
位于我的学习列表的最上方,感谢您的解释。我们是否也可以为重复的名称添加升序编号,例如,
1234
出现两次,将被命名为
>1234_1
>1234_2
,或者如果更容易,只有重复的名称才获得升序编号。@KonradWeber,当然,请检查我的编辑命令,让我知道这看起来是否很好?看起来很好,刚刚发现一些没有更改的随机名称,希望我能找出原因,可能是由于
ref.txt
文件与
seq.fa
中的名称不同。已解决!文件不一致,我的折叠。(它是
seq.fa中的
BC01
ref.txt中的
BC1
)感谢您的帮助,非常感谢!我有点太快了。因为编辑“just”添加到所有
名称
a
\u 1
,导致
name\u 1
,即使文件中的名称加倍了。我找到了一个解决方案,不是在同一个代码中,而是在这里额外运行一行<代码>awk-iinplace'(/^>/&&s[$0]+){$0=$0”u0s[$0]}1;'seq.fa
将在副本的名称后添加一个
\u 2
。很好<代码>awk
位于我的学习列表的最上方,感谢您的解释。我们是否也可以为重复的名称添加升序编号,例如,
1234
出现两次,将被命名为
>1234_1
>1234_2
,或者如果更容易,只有重复的名称才获得升序编号。@KonradWeber,当然,请检查我的编辑命令,让我知道这看起来是否很好?看起来很好,刚刚发现一些没有更改的随机名称,希望我能找出原因,可能是由于
ref.txt
文件与
seq.fa
中的名称不同。已解决!文件不一致,我的折叠。(它是
seq.fa中的
BC01
ref.txt中的
BC1
)感谢您的帮助,非常感谢!我有点太快了。因为编辑“just”添加到所有
名称
a
\u 1
,导致
name\u 1
,即使文件中的名称加倍了。我找到了一个解决方案,不是在同一个代码中,而是在这里额外运行一行<代码>awk-iinplace'(/^>/&&s[$0]+){$0=$0”u0s[$0]}1;'seq.fa
将在副本名称后添加一个
\u 2