在fasta序列中搜索和替换

时间:2012-11-30 19:20:27

标签: perl unix sed awk

我正在寻找一些使用狂野角色进行搜索和替换的线性解决方案..

输入:

>sequence1
ATGCCAAACTGGAACT[A/T]ATTCAATGGCATGGACATAAATTC[A/C]ATACAATTACAAA
>sequnce2
ATCAAACCGGTATGTACATT[A,T/G]ATTCATTACTA

输出:

>sequence1
ATGCCAAACTGGAACTNATTCAATGGCATGGACATAAATTCNATACAATTACAAA
>sequnce2
ATCAAACCGGTATGTACATTNATTCATTACTA

我需要用“N”代替“[”和“]”中的所有内容。数据长度可能会有所不同 我能够使用awk脚本找到模式,但不知道如何替换它。请帮忙..

awk -F'[][]' '{for(i=2;i<=NF;i=i+2) print $i}' 1.fasta

我尝试的另一件事是vi编辑器

:%s/[.*\]/N/g

使用上面一个,它将所有“[A / T] ATTCAATGGCATGGACATAAATTC [A / C]”替换为N

4 个答案:

答案 0 :(得分:4)

尝试这样做:

perl -pe 's/\[.*?\]/N/g' file.txt

说明(关于regex)

  • s///是基本替换骨架(适用于perlsed):s/before/after/
  • s///g:最后的g修饰符,表示所有出现
  • \[:表示:文字[(或其他任何反向广告
  • .:表示:任何字符
  • *表示: 0或N个字符
  • ?告诉最后一个正则表达式 not greedy 模式

那就是说,我有另一个搞笑解决方案:

perl -ne 'print join "N", split /\[.*?\]/;' file.txt

也许更清楚这样?! (但仍然相同)

perl -ne '
    print join(
        "N",
        split(/\[.*?\]/)
    );
' file.txt

答案 1 :(得分:0)

sed 's/\[[^]]*\]/N/g' file

编辑:按要求解释:

查找文字“[”([)然后是任何序列的零或多个非“]”字符([^]] *),后跟文字“]”(])并将整个字符串替换为字母N.在每条线上以“g”形式表示。

答案 2 :(得分:0)

只需添加另一个awk单行。 你的目标是替换,不需要玩$ x

awk '{gsub(/\[[^\]]*\]/,"N")}1' file

答案 3 :(得分:0)

这适用于vi编辑器:

%s/\[[^\]]*\]/N/g