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