2009-10-09 9 views
15

Ho un dati in che arriva sempre in blocco di quattro nel seguente formato (chiamato FASTQ):Conversione FASTQ per FASTA con 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/>/ 

C'è una semplice/awk/modo bash sed convertirli in questo formato (chiamato FASTA):

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

in linea di principio vogliamo estrarre le prime due linee in ogni blocco-di-4 e sostituirlo con @>.

+0

Ok, ho appena ricevuto un mal di testa. – Homework

risposta

19

Questa è una vecchia domanda e ci sono state molte diverse soluzioni offerte. Poiché la risposta accettata usa sed, ma ha un problema evidente (che sostituirà @ con> quando il simbolo @ appare come la prima lettera della linea di qualità), mi sento in dovere di offrire una semplice soluzione basata su sed che funzioni effettivamente :

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

l'unica ipotesi fatta è che ogni lettura occupa esattamente 4 righe nel file FASTQ, ma che sembra abbastanza sicuro, nella mia esperienza.

Anche lo script fastq_to_fasta nel toolkit fastx funziona. (Vale la pena ricordare che è necessario specificare l'opzione -Q33 per adattare le attuali qualifiche Phred + 33. Che è divertente, dato che sta comunque buttando via i dati di qualità!)

+2

Convertitore più veloce che abbia visto finora! 10 milioni di letture in 14s! –

+2

Questo è oro puro. – darxsys

+1

Ottima soluzione! –

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 

sotto

awk '{gsub(/^[@]/,">"); print}' data 

in cui i dati è il file di dati. ho ricevuto:

>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

questo è corretto! – bua

1

Ecco la soluzione per la parte "saltare ogni altra linea" del problema che ho appena appreso da 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 

Se tutto ciò che deve essere fatto è cambiare una @->, allora mi sa

while read line 
do 
    echo "$line" | sed 's/@/>/' 
    read line 
    echo "$line" 

    read line_to_skip 
    read line_to_skip 
done 

farà il lavoro.

+0

dovrebbe esserci un reindirizzamento dell'input per il file di input. per sostituire i caratteri in bash, $ {line/@ />} dovrebbe essere sufficiente. non c'è bisogno di sed – ghostdog74

1

Qualcosa di simile:

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

dovrebbe funzionare.

+0

poiché si sta già utilizzando awk, non è necessario sprecare un processo aggiuntivo che chiama sed. fai la sostituzione dentro awk. – ghostdog74

+0

Hai ragione. Ho upvoted la tua risposta. – mouviciel

1

credo, con grep GNU questo potrebbe essere fatto con questo:

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

se il file sembra essere molto grande, non ha senso incatenare greps e sed insieme così. – ghostdog74

7

solo awk, non c'è bisogno di altri strumenti

# 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 non è morto. Se stiamo golf:

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

Oppure, emulando http://www.ringtail.tsl.ac.uk/david-studholme/scripts/fastq2fasta.pl pubblicato da Pierre, che viene stampata solo la prima parola (l'id) dalla prima linea e fa (un po ') la gestione degli errori:

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

Sembra che ci siano molti strumenti esistenti per la conversione di questi formati; probabilmente dovresti usare questi invece di qualsiasi cosa postata qui (incluso il precedente).

+1

sed è molto vivo, ma la soluzione sed proposta probabilmente affonderà il tuo flusso di lavoro. Non puoi fare affidamento sul carattere @ per indicare in modo univoco le linee di intestazione - anche le linee di qualità possono iniziare con @. Si prega di vedere la mia correzione qui sotto. – Owen

9

Come descritto in Cock, et al (2009) NAR, molte di queste soluzioni non sono corrette poiché "il carattere del carattere" @ "(ASCII 64) può verificarsi ovunque nella stringa di qualità. Ciò significa che qualsiasi parser non deve trattare una riga che inizia con '@' come indica l'inizio del prossimo record, senza verificare ulteriormente la lunghezza della stringa di qualità che corrisponde alla lunghezza della sequenza.. "

Vedi http://ukpmc.ac.uk/articlerender.cgi?accid=PMC2847217 per i dettagli

+0

Non valido per nessuna soluzione che specifica che il carattere @ è all'inizio della riga con '^ @', che sembra rappresentare la maggior parte delle risposte. Cheers – Morlock

+1

In realtà, questa è una vera affermazione dal momento che un valore di qualità di @ può in linea di principio verificarsi ovunque nella stringa di qualità incluso il primo carattere, '^ @' non è garantito per catturare solo le linee di nome. –

+0

Infatti. Ci scusiamo per non aver impiegato qualche secondo per pensare correttamente al problema. Cheers – Morlock

1

So di essere così in futuro, ma per il bene di Googler:

Si consiglia di utilizzare fastq_to_fasta from the fastx toolkit manterrà il simbolo @, però. . sarà anche rimuovere le linee con Ns a meno che non gli si dice di non farlo.

2

mi piacerebbe scrivere

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

Questo è il più veloce che ho, un d ho bloccato nel mio file .bashrc:

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

E non manca sulle linee rari ma non impossibili qualità che iniziano con @ ... ma che non riescono a avvolto FASTQ, se questo è anche legale (si esiste comunque).