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质量编码.这很有趣,因为它无论如何都会丢弃质量数据!)
赛德并没有死.如果我们打高尔夫球:
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)
似乎有很多现有的工具可用于转换这些格式; 您应该使用这些而不是在此处发布的任何内容(包括上述内容).
正如Cock,et al(2009)NAR中详述的那样,许多这些解决方案都是错误的,因为"'''标记字符(ASCII 64)可能出现在质量字符串中的任何位置.这意味着任何解析器都不能处理以'@'表示下一条记录的开始,而不另外检查质量字符串的长度到目前为止与序列的长度相匹配."
有关详细信息,请参见http://ukpmc.ac.uk/articlerender.cgi?accid=PMC2847217.
只是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)