【问题标题】:replace names in fasta替换fasta中的名字
【发布时间】:2020-01-01 23:00:28
【问题描述】:

我想根据包含新名称的文本文件更改 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

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

请教如何调整代码?

所需的结果应如下所示:将 BC1 替换为文本文件中的数字 1234

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

【问题讨论】:

    标签: bash awk replace fasta


    【解决方案1】:

    请您尝试关注一下。

    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_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 就在我的学习列表之上,感谢您的解释。我们是否还可以为重复的名称添加升序编号,例如1234 出现两次,将被命名为 >1234_1>1234_2 或者如果更容易,只有重复的部分会升序编号。
    • @KonradWeber,当然,请检查我的 EDIT 命令,如果现在看起来不错,请告诉我?
    • 看起来刚刚好,只是发现一些随机名称没有更改,希望我能弄清楚,可能是由于ref.txt文件与seq.fa中的名称不同。
    • 解决了!文件不一致,我的折叠。 (在seq.fa 中是BC01,在ref.txt 中是BC1。)感谢您的帮助,非常感谢!
    • 我有点快速调用解决了。因为编辑“只是”添加到所有 names_1 导致 name_1 即使名称在文件中加倍。我找到了一个解决方案,不是在相同的代码中,而是在link 的额外行中运行。 awk -iinplace '(/^>/ && s[$0]++){$0=$0"_"s[$0]}1;' seq.fa 将在副本名称后添加 _2
    【解决方案2】:

    不需要 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 的所有行,其中两个字段以> 作为字段分隔符。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多