首页 文章

使用SED / AWK将FASTQ转换为FASTA

提问于
浏览
17

我有一个数据,总是以下列格式(称为FASTQ)以四块为单位:

@SRR018006.2016 GA2:6:1:20:650 length=36
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGN
+SRR018006.2016 GA2:6:1:20:650 length=36
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!+!
@SRR018006.19405469 GA2:6:100:1793:611 length=36
ACCCGCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
+SRR018006.19405469 GA2:6:100:1793:611 length=36
7);;).;);;/;*.2>/@@7;@77<..;)58)5/>/

是否有一种简单的sed / awk / bash方式将它们转换为这种格式(称为FASTA):

>SRR018006.2016 GA2:6:1:20:650 length=36
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGN
>SRR018006.19405469 GA2:6:100:1793:611 length=36
ACCCGCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC

原则上,我们想要在每个4个块中提取前两行,并将 @ 替换为 > .

13 回答

  • 1

    这是一个老问题,并且提供了许多不同的解决方案 . 由于接受的答案使用sed但有一个明显的问题(当@符号作为质量线的第一个字母出现时它将取代@),我觉得有必要提供一个简单的基于sed的解决方案,它实际上有效:

    sed -n '1~4s/^@/>/p;2~4p'
    

    唯一的假设是每次读取在FASTQ文件中只占用4行,但根据我的经验,这看起来非常安全 .

    fastx工具包中的fastq_to_fasta脚本也可以使用 . (值得一提的是,您需要指定-Q33选项以适应现在常见的Phred 33质量编码 . 这很有趣,因为它无论如何都会丢弃质量数据!)

  • 9

    赛德并没有死 . 如果我们打高尔夫球:

    sed '/^@/!d;s//>/;N'
    

    或者,模仿Pierre发布的http://www.ringtail.tsl.ac.uk/david-studholme/scripts/fastq2fasta.pl,它只打印第一行的第一个单词(id)并进行(某些)错误处理:

    #!/usr/bin/sed -f
    # Read a total of four lines
    $b error
    N;$b error
    N;$b error
    N
    # Parse the lines
    /^@\(\([^ ]*\).*\)\(\n[ACGTN]*\)\n+\1\n.*$/{
      # Output id and sequence for FASTA format.
      s//>\2\3/
      b
    }
    :error
    i\
    Error parsing input:
    q
    

    似乎有很多现有的工具可用于转换这些格式;您应该使用这些而不是在此处发布的任何内容(包括上述内容) .

  • 7

    正如Cock,et al(2009)NAR中详述的那样,许多这些解决方案都是错误的,因为“'''标记字符(ASCII 64)可能出现在质量字符串中的任何位置 . 这意味着任何解析器都不能处理以'@'表示下一条记录的开始,而不另外检查质量字符串的长度到目前为止与序列的长度相匹配 . “

    有关详细信息,请参阅http://ukpmc.ac.uk/articlerender.cgi?accid=PMC2847217 .

  • 1

    只是awk,不需要其他工具

    # awk '/^@SR/{gsub(/^@/,">",$1);print;getline;print}' file
    >SRR018006.2016 GA2:6:1:20:650 length=36
    NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGN
    >SRR018006.19405469 GA2:6:100:1793:611 length=36
    ACCCGCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
    
  • 1
  • 1

    我会写的

    awk '
        NR%4 == 1 {print ">" substr($0, 2)}
        NR%4 == 2 {print}
    ' fastq > fasta
    
  • 19

    这是我得到的最快的,我把它放在我的.bashrc文件中:

    alias fq2fa="awk '{print \">\" substr(\$0,2);getline;print;getline;getline}'"
    

    它不会以偶然但不是不可能的质量行开始,它们以@开头但在包装的FASTQ上失败,如果这甚至是合法的(尽管存在) .

  • 9

    这是我刚从SO学到的问题的“跳过每一行”的解决方案:

    while read line
    do
        # print two lines
        echo "$line"
        read line_to_print
        echo "$line_to_print"
    
        # and skip two lines
        read line_to_skip
        read line_to_skip
    done
    

    如果所有需要做的就是将 @ 更改为 > ,那么我估计

    while read line
    do
        echo "$line" | sed 's/@/>/'
        read line
        echo "$line"
    
        read line_to_skip
        read line_to_skip
    done
    

    会做的 .

  • 1

    就像是:

    awk 'BEGIN{a=0}{if(a==1){print;a=0}}/^@/{print;a=1}' myFastqFile | sed 's/^@/>/'
    

    应该管用 .

  • 4

    我想,使用gnu grep可以用这个来完成:

    grep -A 1 "^@" t.txt | grep -v "^--" | sed -e "s/^@/\>/"
    
  • 3
    awk 'BEGIN{P=1}{if(P==1||P==2){gsub(/^[@]/,">");print}; if(P==4)P=0; P++}' data
    
    >SRR018006.2016 GA2:6:1:20:650 length=36
    NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGN
    >SRR018006.19405469 GA2:6:100:1793:611 length=36
    ACCCGCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
    

    下面

    awk '{gsub(/^[@]/,">"); print}' data
    

    数据是您的数据文件 . 我收到了:

    >SRR018006.2016 GA2:6:1:20:650 length=36
    NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGN
    +SRR018006.2016 GA2:6:1:20:650 length=36
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!+!
    >SRR018006.19405469 GA2:6:100:1793:611 length=36
    ACCCGCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
    +SRR018006.19405469 GA2:6:100:1793:611 length=36
    7);;).;);;/;*.2>/@@7;@77<..;)58)5/>/
    
  • 1

    我知道我将来的方式,但为了googlers的利益:

    您可能想要使用fastq_to_fasta from the fastx toolkit . 但它会保留@符号 . 它也会删除带有Ns的行,除非你不告诉它 .

  • 2

    您可能对bioawk感兴趣,它是awk的改编版本,可以调整处理fasta文件

    bioawk -c fastx '{ print ">"$name ORS $seq }' file.fastq
    

    Note: BioAwk基于Brian Kernighan's awk,记录在"The AWK Programming Language", by Al Aho, Brian Kernighan, and Peter Weinberger (Addison-Wesley, 1988, ISBN 0-201-07981-X)中 . 我不确定这个版本是否与POSIX兼容 .

相关问题