使用SED/AWK将FASTQ转换为FASTA

nev*_*int 18 shell awk sed fasta fastq

我有一个数据,总是以下列格式(称为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/>/
Run Code Online (Sandbox Code Playgroud)

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

>SRR018006.2016 GA2:6:1:20:650 length=36
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGN
>SRR018006.19405469 GA2:6:100:1793:611 length=36
ACCCGCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
Run Code Online (Sandbox Code Playgroud)

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

Owe*_*wen 22

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

sed -n '1~4s/^@/>/p;2~4p' 
Run Code Online (Sandbox Code Playgroud)

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

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

  • 到目前为止我见过的最快的转换器!在14s读取1000万! (2认同)
  • 这是纯金. (2认同)
  • 逐字翻译 sed 表达式:“从第 1 行开始,之后每 4 行,当您在行首看到 @ 字符时,将其替换为 &gt; 字符,并打印结果行;然后,从第2,以及此后的每 4 行,只需打印该行”。-n 选项关闭自动打印,两个 sed 表达式中的 'p' 有选择地打印与表达式匹配的行。希望这可以帮助! (2认同)

Mar*_*gar 9

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

sed '/^@/!d;s//>/;N'
Run Code Online (Sandbox Code Playgroud)

或者,模仿皮埃尔发布的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
Run Code Online (Sandbox Code Playgroud)

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


C. *_*man 9

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

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

  • 实际上,这是一个真实的陈述,因为@的质量值原则上可以出现在质量字符串中的任何位置,包括第一个字符,'^ @'不能保证只捕获名称行. (2认同)

gho*_*g74 7

只是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
Run Code Online (Sandbox Code Playgroud)