【问题标题】:Remove pattern and everything before using AWK in fasta file在 fasta 文件中使用 AWK 之前删除模式和所有内容
【发布时间】:2020-09-29 11:39:58
【问题描述】:

我搜索了很多,但找不到解决问题的方法。我有一个看起来像这样的文件:

>HEADER1
AACTGGTTACGTGGTTCTCT
>HEADER2
GGTTTCTC
>HEADER3
CCAGGTTTCGAGGGGTTACGGGGTA

我想删除GGTT 模式及其之前的所有内容。所以基本上在某些行中有几个这样的模式,所以我想删除所有这些模式,包括模式之前或其中的所有内容。

所需的输出应如下所示:

>HEADER1
CTCT
>HEADER2
TCTC
>HEADER3
ACGGGGTA

我尝试了建议的ways,但无法根据我的数据进行调整。

提前感谢您的帮助。

【问题讨论】:

    标签: awk sed bioinformatics fasta


    【解决方案1】:

    如果您的标题不可能包含GGTT,我想最简单的方法是:

    $ sed 's/.*GGTT//' file
    >HEADER1
    CTCT
    >HEADE2
    TCTC
    >HEADER3
    ACGGGGTA
    

    如果您的标头可能包含GGTT,那么 awk 可能会更好:

    $ awk '!/^>/ {sub(/.*GGTT/, "")}1' file
    >HEADER1
    CTCT
    >HEADE2
    TCTC
    >HEADER3
    ACGGGGTA
    

    在这两种情况下,.*GGTT 都是“贪婪的”,所以如果有多个 GGTT 实例无关紧要,它始终会匹配并删除最后一次出现的所有内容。

    在 awk 版本中,!/^>/ 模式确保仅对不以 > 开头的行进行替换。

    【讨论】:

    • sed 也支持多种过滤器:sed '/^>/! s/.*GGTT//' .. 另外,如果我对 fasta 文件的基本理解正确,标题将不匹配
    • @jas,谢谢你的回答。我还有一个问题,如果你能帮助我,那就太好了。为什么我们没有在这些版本中使用sed,例如:sed 's///g'sed 's///d'?我读到了dg,但没有完全了解它们的优势。我也见过这种格式的 sed sed 's//d'.
    • @Apex s//d 应该是//d (表示删除与正则表达式匹配的行,注意这里只提供正则表达式,没有替换字符串)... g 标志表示替换所有出现,但在此解决方案中只有一个匹配项,因此不需要 g(尽管它仍可与 g 一起使用)...有关学习资源,请参阅 stackoverflow.com/tags/sed/info
    • @Sundeep,感谢您的详细提示。我无法完全理解您所说的 g 在我的示例中不是必需的,因为只有一个匹配项,但我在某些行中有几个 GGTT。我知道我在这里遗漏了一些东西:)
    • 答案中提到的@Apex:In both cases, the .*GGTT is "greedy", so it doesn't matter if there are multiple instances of GGTT, it will always match up to and remove everything through the last occurrence. - 如果仍然无法解决,请参阅my tutorial on quantifiers 以及随后的“最长匹配获胜”部分
    【解决方案2】:

    请注意,一般而言,问题中显示的 fasta 格式的序列可能跨越多行(= 它们通常每行包含 80 或 100 个核苷酸)。与此线程中的其他答案不同,此答案也可以正确处理此类情况。

    使用这两个通过管道连接的 Perl 单线。第一个单行执行所有常见的 fasta 序列重新格式化,这在这种情况和类似情况下是必要的。它删除序列中的换行符和空格(这也解开序列),但不更改序列标题行。它还可以正确处理文件中的前导和尾随空格/换行符。第二行实际上以不区分大小写的方式删除序列中最后一个 GGTT 之前的所有内容。

    注意:如果GGTT 位于序列的末尾,则输出将是一个标题加上一个空序列。请参见下面示例中的 seq4。 这可能会导致下游使用的某些生物信息学工具出现问题。

    # Create the input for testing:
    
    cat > in.fa <<EOF
    
    >seq1 with blanks
    ACGT GGTT ACGT
    >seq2 with newlines
    ACGT
    
    GGTT
    
    ACGT
    
    >seq3 without blanks or newlines
    ACGTGGTTACGT
    
    >seq4 everything should be deleted, with empty sequence in the output
    ACGTGGTTACGTGGTT
    
    >seq5 lowercase
    acgtggttacgt
    
    EOF
    
    # Reformat to single-line fasta, then delete subsequences:
    
    perl -ne 'chomp; if ( /^>/ ) { print "\n" if $n; print "$_\n"; $n++; } else { s/\s+//g; print; } END { print "\n"; }' in.fa | \
      perl -pe 'next if /^>/; s/.*GGTT//i;' > out.fa
    

    在文件out.fa中输出:

    >seq1 with blanks
    ACGT
    >seq2 with newlines
    ACGT
    >seq3 without blanks or newlines
    ACGT
    >seq4 everything should be deleted, with empty sequence in the output
    
    >seq5 lowercase
    acgt
    

    Perl one-linera 使用这些命令行标志:
    -e:告诉 Perl 查找内联代码,而不是在文件中。
    -n:循环输入一行一次,默认分配给$_
    -p:循环输入一行,默认分配给$_。在每次循环迭代后添加print $_

    chomp:删除输入行分隔符(*NIX 上的\n)。
    if ( /^&gt;/ ):测试当前行是否为序列标题行。
    $n:此变量未定义(false) 开头,看到第一个序列头后为 true,在这种情况下,我们打印一个额外的换行符。此换行符位于每个序列的末尾,从第一个序列开始。
    END { print "\n"; } :打印最后一个序列之后的最后一个换行符。
    s/\s+//g; print; :如果当前行是序列(不是标题),删除所有空格并在没有终端换行符的情况下打印。

    next if /^&gt;/; :跳过标题行。 s/.*GGTT//i; :将所有内容(.*)替换为包括最后一个 GGTT 在内的所有内容(= 删除它)。 /i 修饰符表示不区分大小写的匹配。

    另请参阅:
    perldoc perlrun: how to execute the Perl interpreter: command line switches
    perldoc perlre: Perl regular expressions (regexes)
    perldoc perlre: Perl regular expressions (regexes): Quantifiers; Character Classes and other Special Escapes; Assertions; Capture groups

    Remove line breaks in a FASTA file

    【讨论】:

      猜你喜欢
      • 2013-10-03
      • 2012-07-04
      • 1970-01-01
      • 2011-06-05
      • 2022-11-07
      • 2011-05-25
      • 2015-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多