Преобразование 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 и заменить @ на >.


person neversaint    schedule 09.10.2009    source источник
comment
Ладно, у меня только что разболелась голова.   -  person homework    schedule 09.10.2009


Ответы (13)


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

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

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

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

person Owen    schedule 28.04.2012
comment
Благодарю вас! Из-за этой красивой строки кода я, наконец, принял решение изучить sed более тщательно. Вот хороший источник: grymoire.com/Unix/Sed.html#uh-15 У меня все еще есть один вопрос: что делает ~ здесь, пожалуйста? Спасибо - person Helene; 02.11.2016
comment
Чтобы перевести выражение sed дословно: начиная с строки 1 и каждой четвертой строки после этого, когда вы видите символ @ в начале строки, замените его символом › и напечатайте результирующую строку; затем, начиная со строки 2 и каждой четвертой строки после этого, просто напечатайте строку. Параметр -n отключает автоматическую печать, а 'p' в двух выражениях sed выборочно печатает строки, соответствующие выражению. надеюсь это поможет! - person Owen; 03.11.2016

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

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

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

person Mark Edgar    schedule 09.10.2009
comment
sed очень даже жив, но предлагаемое здесь решение sed, скорее всего, потопит ваш рабочий процесс. Вы не можете полагаться на символ @ для однозначного обозначения строк заголовков — строки качества также могут начинаться с @. Пожалуйста, смотрите мое исправление ниже. - person Owen; 06.04.2013

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

См. http://ukpmc.ac.uk/articlerender.cgi?accid=PMC2847217 для подробностей.

person C. Bergman    schedule 09.05.2010
comment
Неверно для любого решения, указывающего, что символ @ находится в начале строки с «^@», что, по-видимому, представляет собой большинство ответов. Ваше здоровье - person Morlock; 13.04.2011
comment
На самом деле это верное утверждение, поскольку значение качества @ в принципе может встречаться в любом месте строки качества, включая первый символ, '^@' не гарантирует захват только строк имени. - person C. Bergman; 10.08.2011
comment
Конечно. Извините, что не потратил еще несколько секунд, чтобы как следует обдумать проблему. Ваше здоровье - person Morlock; 26.08.2011

просто 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
person ghostdog74    schedule 09.10.2009

См. fastq2fasta.pl на http://www.ringtail.tsl.ac.uk/david-studholme/scripts/

person Pierre    schedule 09.10.2009

я бы написал

awk '
    NR%4 == 1 {print ">" substr($0, 2)}
    NR%4 == 2 {print}
' fastq > fasta
person glenn jackman    schedule 30.06.2011

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

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

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

person Peter    schedule 27.10.2011

Вот решение проблемы "пропустить каждую вторую строку", о которой я только что узнал из 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

сделает работу.

person mob    schedule 09.10.2009
comment
должно быть перенаправление ввода для входного файла. для замены символов в bash достаточно ${line/@/›}. не надо сед. - person ghostdog74; 09.10.2009

Что-то вроде:

awk 'BEGIN{a=0}{if(a==1){print;a=0}}/^@/{print;a=1}' myFastqFile | sed 's/^@/>/'

должно сработать.

person mouviciel    schedule 09.10.2009
comment
поскольку вы уже используете awk, нет необходимости тратить дополнительный процесс на вызов sed. сделать замену внутри awk. - person ghostdog74; 09.10.2009

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

grep -A 1 "^@" t.txt | grep -v "^--" | sed -e "s/^@/\>/"
person dz.    schedule 09.10.2009
comment
если файл окажется очень большим, нет смысла объединять greps и sed вместе. - person ghostdog74; 09.10.2009

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/>/
person bua    schedule 09.10.2009

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

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

person mmarchin    schedule 30.06.2011

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

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

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

person kvantour    schedule 12.12.2018