2009-10-09 3 views
15

У меня есть данные, что всегда приходит в блоке из четырех в следующем формате (так называемый FASTQ):Преобразование FASTQ в FASTA с SED/AWK

@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/>/ 

Есть простой СЕПГ/AWK/Баш путь чтобы превратить их в этот формат (так называемый FASTA):

>SRR018006.2016 GA2:6:1:20:650 length=36 
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGN 
>SRR018006.19405469 GA2:6:100:1793:611 length=36 
ACCCGCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 

в принципе, мы хотим, чтобы извлечь первые две строки в каждом из блоков из-4 и заменить @ с >.

+0

Хорошо, я только что получил головную боль. – Homework

ответ

19

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

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

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

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

+2

Самый быстрый конвертер, который я видел до сих пор! 10 миллионов читают за 14 секунд! –

+2

Это чистое золото. – darxsys

+1

Отличное решение! –

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 

где данные файла данных. Я получил:

>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/>/ 
+1

это правильно! – bua

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 

будет делать эту работу.

+0

должно быть перенаправление ввода для входного файла. для замены символов в bash, $ {line/@ />} должно быть достаточно. нет необходимости sed. – ghostdog74

1

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

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

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

+0

Поскольку вы используете awk уже, нет необходимости тратить лишний процесс на вызов sed. сделайте замену внутри awk. – ghostdog74

+0

Вы правы. Я поддержал ваш ответ. – mouviciel

1

Я думаю, с Gnu Grep это может быть сделано с этим:

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

, если файл окажется очень большим, нет цепочки цепочек greps и sed вместе. – ghostdog74

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 
9

sed не мертв. Если мы играть в гольф:

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 

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

+1

sed очень живой, но предлагаемое здесь решение sed скорее всего утонет ваш рабочий процесс. Вы не можете полагаться на символ @, чтобы однозначно указывать строки заголовков - линии качества также могут начинаться с @. См. Мое исправление ниже. – Owen

9

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

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

+0

Не верно для любого решения, указывающего, что символ @ находится в начале строки с символом «^ @», который, как представляется, представляет большинство ответов. Cheers – Morlock

+1

На самом деле, это истинное утверждение, поскольку значение качества @ может в принципе происходить где угодно в строке качества, включая первый символ, '^ @' не гарантирует, что поймает только строки имени. –

+0

Действительно. Извините за то, что у вас не было еще нескольких секунд, чтобы правильно подумать о проблеме. Cheers – Morlock

1

Я знаю, что путь в будущее, но в пользу Googlers:

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

2

Я бы написать

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

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

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

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

Смежные вопросы