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.
Consulte fastq2fasta.pl en http://www.ringtail.tsl.ac.uk/david-studholme/scripts/
Creo que con gnu grep esto se podría hacer con esto:
grep -A 1 "^@" t.txt | grep -v "^--" | sed -e "s/^@//>/"
Es posible que esté interesado en bioawk, es una versión adaptada de awk que está optimizada para procesar archivos fasta
bioawk -c fastx ''{ print ">"$name ORS $seq }'' file.fastq
Nota: BioAwk se basa en el awk de Brian Kernighan que está documentado en "El lenguaje de programación AWK", por Al Aho, Brian Kernighan y Peter Weinberger (Addison-Wesley, 1988, ISBN 0-201-07981-X) . No estoy seguro si esta versión es compatible con POSIX .
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/>/