Преобразование FASTQ в FASTA с SED/AWK
у меня есть данные, которые всегда входят в блок из четырех в следующем формате (называется 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
и заменить @
С >
.
12 ответов
Это старый вопрос, и было предложено много различных решений. Поскольку принятый ответ использует sed, но имеет вопиющую проблему (которая заключается в том, что он заменит @ на>, когда знак @ появится как первая буква строки качества), я чувствую себя вынужденным предложить простое решение на основе sed, которое действительно работает:
sed -n '1~4s/^@/>/p;2~4p'
единственное предположение, что каждое чтение занимает ровно 4 строки в файле FASTQ, но это кажется довольно безопасным, в моем опыт.
скрипт fastq_to_fasta в наборе инструментов fastx также работает. (Стоит отметить, что вам нужно указать опцию-Q33 для размещения теперь распространенных кодировок phred+33 qual. Что забавно, так как это выбрасывает качественные данные в любом случае!)
сед не умер. Если мы гольф:
sed '/^@/!d;s//>/;N'
или, подражая http://www.ringtail.tsl.ac.uk/david-studholme/scripts/fastq2fasta.pl опубликовано Pierre, который печатает только первое слово (идентификатор) из первой строки и делает (некоторые) обработку ошибок:
#!/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+\n.*$/{
# Output id and sequence for FASTA format.
s//>/
b
}
:error
i\
Error parsing input:
q
Кажется, существует множество существующих инструментов для преобразования этих форматов; вы, вероятно, должны использовать их вместо всего, что опубликовано здесь (включая выше).
Как подробно описано в Cock, et al (2009) NAR, многие из этих решений неверны, так как символ маркера " @ " (ASCII 64) может встречаться в любом месте строки качества. Это означает, что любой парсер не должен рассматривать строку, начинающуюся с"@", как указывающую на начало следующей записи, без дополнительной проверки длины строки качества до сих пор соответствует длине последовательности."
см.http://ukpmc.ac.uk/articlerender.cgi?accid=PMC2847217 для подробности.
просто awk, не нужны другие инструменты
# awk '/^@SR/{gsub(/^@/,">",);print;getline;print}' file
>SRR018006.2016 GA2:6:1:20:650 length=36
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGN
>SRR018006.19405469 GA2:6:100:1793:611 length=36
ACCCGCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
см.fastq2fasta.pl в http://www.ringtail.tsl.ac.uk/david-studholme/scripts/
Это самый быстрый у меня есть, и я засунул его в свой .файл bashrc:
alias fq2fa="awk '{print \">\" substr($0,2);getline;print;getline;getline}'"
он не терпит неудачу на нечастых, но не невозможных качественных строках, которые начинаются с @... но не работает на завернутом FASTQ, если это даже законно (он существует, хотя).
вот решение части" пропустить каждую другую строку " проблемы, которую я только что узнал из 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
если все, что нужно сделать, это изменить один @
to >
, Я полагаю,
while read line
do
echo "$line" | sed 's/@/>/'
read line
echo "$line"
read line_to_skip
read line_to_skip
done
сделает работу.
что-то типа:
awk 'BEGIN{a=0}{if(a==1){print;a=0}}/^@/{print;a=1}' myFastqFile | sed 's/^@/>/'
должны работать.
Я думаю, с gnu grep это можно было бы сделать с помощью этого:
grep -A 1 "^@" t.txt | grep -v "^--" | sed -e "s/^@/\>/"
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/>/
Я знаю, что я в будущем, но для пользы гуглеров:
вы можете использовать fastq_to_fasta из инструментария fastx. Однако он сохранит знак@. Он также удалит строки с Ns, Если вы не скажете ему не делать этого.