Преобразование 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


Я бы написал

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

Это самый быстрый у меня есть, и я засунул его в свой .файл 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, Если вы не скажете ему не делать этого.