我有一个数据,总是四个块 采用以下格式(称为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块中提取前两行
并将@
替换为>
。
答案 0 :(得分:21)
这是一个老问题,提供了许多不同的解决方案。由于接受的答案使用sed但有一个明显的问题(当@符号作为质量线的第一个字母出现时,它将取代@ with&gt;)我觉得有必要提供一个简单的基于sed的解决方案,实际上工作原理:
sed -n '1~4s/^@/>/p;2~4p'
唯一的假设是每次读取在FASTQ文件中只占用4行,但根据我的经验,这看起来非常安全。
fastx工具包中的fastq_to_fasta脚本也可以使用。 (值得一提的是,您需要指定-Q33选项以适应现在常见的Phred + 33质量编码。这很有趣,因为它无论如何都会丢弃质量数据!)
答案 1 :(得分: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
似乎有很多现有的转换这些格式的工具;你应该使用这些而不是在这里发布的任何东西(包括上面的内容)。
答案 2 :(得分:9)
详见Cock,et al(2009)NAR,其中许多解决方案都不正确,因为“'''标记字符(ASCII 64)可能出现在质量字符串中的任何位置。这意味着任何解析器都不能处理以'@'开头的行表示下一条记录的开始,而不另外检查质量字符串的长度到目前为止与序列的长度匹配。“
有关详细信息,请参阅http://ukpmc.ac.uk/articlerender.cgi?accid=PMC2847217。
答案 3 :(得分: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
答案 4 :(得分:4)
答案 5 :(得分:3)
我会写
awk '
NR%4 == 1 {print ">" substr($0, 2)}
NR%4 == 2 {print}
' fastq > fasta
答案 6 :(得分:2)
这是我得到的最快的,我把它放在我的.bashrc文件中:
alias fq2fa="awk '{print \">\" substr(\$0,2);getline;print;getline;getline}'"
对于以@开头的不常见但不是不可能的质量线,它不会失败但是在包装的FASTQ上失败,如果这甚至是合法的(虽然它存在)。
答案 7 :(得分:1)
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
其中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/>/
答案 8 :(得分:1)
以下是我刚从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
将完成这项工作。
答案 9 :(得分:1)
类似的东西:
awk 'BEGIN{a=0}{if(a==1){print;a=0}}/^@/{print;a=1}' myFastqFile | sed 's/^@/>/'
应该有用。
答案 10 :(得分:1)
我认为,使用gnu grep可以用这个来完成:
grep -A 1 "^@" t.txt | grep -v "^--" | sed -e "s/^@/\>/"
答案 11 :(得分:1)
我知道我将来会这样,但为了googlers的利益:
您可能想要使用fastq_to_fasta from the fastx toolkit。但它会保留@符号。它也会删除带有Ns的行,除非你不告诉它。
答案 12 :(得分:1)
您可能对bioawk感兴趣,它是awk的改编版本,已调整为可处理fasta文件
bioawk -c fastx '{ print ">"$name ORS $seq }' file.fastq
注意::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兼容。