Преобразование FASTQ в FASTA с помощью SED / AWK - PullRequest
17 голосов
/ 09 октября 2009

У меня есть данные, которые всегда поступают в блоке из четырех в следующем формате (называемом 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 и замените @ на >.

Ответы [ 13 ]

21 голосов
/ 28 апреля 2012

Это старый вопрос, и было предложено много разных решений. Поскольку принятый ответ использует sed, но имеет явную проблему (а именно, что он заменит @ на>, когда знак @ появляется в качестве первой буквы строки качества), я вынужден предложить простое решение на основе sed, которое действительно работает :

sed -n '1~4s/^@/>/p;2~4p' 

Единственное допущение состоит в том, что каждое чтение занимает ровно 4 строки в файле FASTQ, но, по моему мнению, это довольно безопасно.

Сценарий fastq_to_fasta в комплекте инструментов fastx также работает. (Стоит отметить, что вам нужно указать опцию -Q33, чтобы учесть общепринятые теперь квалифицированные кодировки Phred + 33. Это забавно, так как в любом случае это отбрасывает данные качества!)

9 голосов
/ 10 мая 2010

Как подробно описано в NAR Cock, et al. (2009), многие из этих решений неверны, поскольку «маркерный символ« @ »(ASCII 64) может встречаться в любом месте строки качества. Это означает, что любой анализатор не должен обрабатывать строка, начинающаяся с '@', обозначающая начало следующей записи, без дополнительной проверки длины строки качества до настоящего времени соответствует длине последовательности. "

Подробнее см. http://ukpmc.ac.uk/articlerender.cgi?accid=PMC2847217.

9 голосов
/ 09 октября 2009

Сед не умер. Если мы играем в гольф:

sed '/^@/!d;s//>/;N'

Или, эмулируя http://www.ringtail.tsl.ac.uk/david-studholme/scripts/fastq2fasta.pl от Пьера, который печатает только первое слово (идентификатор) из первой строки и (некоторые) обрабатывает ошибки:

#!/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

Кажется, существует множество существующих инструментов для преобразования этих форматов; Вы, вероятно, должны использовать их вместо всего, что размещено здесь (в том числе выше).

7 голосов
/ 09 октября 2009

просто 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 голосов
/ 09 октября 2009
3 голосов
/ 01 июля 2011

я бы написал

awk '
    NR%4 == 1 {print ">" substr($0, 2)}
    NR%4 == 2 {print}
' fastq > fasta
2 голосов
/ 28 октября 2011

Это самое быстрое, что у меня есть, и я вставил его в мой файл .bashrc:

alias fq2fa="awk '{print \">\" substr(\$0,2);getline;print;getline;getline}'"

Он не терпит неудачу на нечастых, но не невозможных линиях качества, которые начинаются с @ ..., но не распространяется на упакованные FASTQ, если это даже допустимо (хотя и существует).

1 голос
/ 12 декабря 2018

Вас может заинтересовать bioawk, это адаптированная версия awk, которая настроена для обработки файлов fasta

bioawk -c fastx '{ print ">"$name ORS $seq }' file.fastq

Примечание: BioAwk основано на awk Брайана Кернигана, который задокументирован в "Язык программирования AWK", Аль Ахо, Брайан Керниган и Питер Вайнбергер (Addison-Wesley, 1988, ISBN 0-201-07981-X) . Я не уверен, совместима ли эта версия с POSIX .

1 голос
/ 30 июня 2011

Я знаю, что я в будущем, но для гуглеров:

Вы можете использовать fastq_to_fasta из набора инструментов fastx . Это будет держать знак @, хотя. Он также удалит строки с Ns, если вы не скажете, что нет.

1 голос
/ 09 октября 2009

Я думаю, с помощью GNU grep это можно сделать следующим образом:

grep -A 1 "^@" t.txt | grep -v "^--" | sed -e "s/^@/\>/"
...