shell awk sed fasta fastq

shell - Convertir FASTQ a FASTA con SED/AWK



(13)

Algo como:

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

Deberia trabajar.

Tengo datos que siempre vienen en el bloque de cuatro en el siguiente formato (llamado 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/>/

¿Existe una forma simple de convertirlos a este formato (llamado FASTA)?

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

En principio, queremos extraer las dos primeras líneas en cada bloque de 4 y reemplazar @ con > .


Aquí está la solución a la parte de "omitir cada otra línea" del problema que acabo de aprender de 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

Si todo lo que hay que hacer es cambiar una @ a > , supongo que

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

Hará el trabajo.


Como se detalla en NAR de Cock, et al (2009), muchas de estas soluciones son incorrectas ya que el carácter de marcador "@" (ASCII 64) puede aparecer en cualquier lugar de la cadena de calidad. Esto significa que cualquier analizador no debe tratar una línea que comience con "@ ''indica el inicio del siguiente registro, sin verificar adicionalmente la longitud de la cadena de calidad hasta el momento coincide con la longitud de la secuencia".

Consulte http://ukpmc.ac.uk/articlerender.cgi?accid=PMC2847217 para obtener más información.



Creo que con gnu grep esto se podría hacer con esto:

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



Esta es una pregunta antigua y se han ofrecido muchas soluciones diferentes. Dado que la respuesta aceptada utiliza sed pero tiene un problema evidente (que es que reemplazará @ con> cuando el signo @ aparezca como la primera letra de la línea de calidad), me siento obligado a ofrecer una solución simple basada en sed que realmente funcione :

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

La única suposición que se hace es que cada lectura ocupa exactamente 4 líneas en el archivo FASTQ, pero en mi experiencia, parece bastante seguro.

El script fastq_to_fasta en el kit de herramientas fastx también funciona. (Vale la pena mencionar que debe especificar la opción -Q33 para acomodar las codificaciones de calidad de Phred + 33 que ahora son comunes. Lo que es gracioso, ya que de todos modos está eliminando los datos de calidad).


Este es el más rápido que tengo, y lo pegué en mi archivo .bashrc:

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

No falla en las líneas de calidad poco frecuentes pero no imposibles que comienzan con @ ... pero sí falla en FASTQ envuelto, si eso es legal (aunque existe).


Sé que estoy en el futuro, pero en beneficio de los usuarios de Google:

Es posible que desee utilizar fastq_to_fasta desde el kit de herramientas de fastx . Sin embargo, mantendrá el signo @. También eliminará las líneas con Ns a menos que le digas que no lo haga.


Yo escribo

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


no está muerto. Si estamos jugando al golf:

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

O, emulando http://www.ringtail.tsl.ac.uk/david-studholme/scripts/fastq2fasta.pl publicado por Pierre, que solo imprime la primera palabra (el id) desde la primera línea y (algunos) error manejo:

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

Parece que hay un montón de herramientas existentes para convertir estos formatos; Probablemente debería usar estos en lugar de cualquier cosa publicada aquí (incluido lo anterior).


solo awk, no necesitas otras herramientas

# 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


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

abajo

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

donde los datos son su archivo de datos He recibido:

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