Tengo el siguiente comando que funciona en un archivo bam
reformat.sh in=test.bam out=stdout.fq primaryonly | reformat.sh in=stdin.fq out1=r1.fq.gz out2=r2.fq.gz interleaved addcolon
La idea aquí es evitar escribir la salida del primer comando (reformat.sh) en un archivo, lo que aumenta la velocidad general.
Tengo varios archivos bam en mi directorio de trabajo actual y quiero ejecutarlos en el clúster en paralelo. ¿Cómo puedo usar stdout.fq y stdin.fq en el comando anterior para que cuando se procesen varios archivos bam simultáneamente, stdout.fq/stdin.fq no interfiera entre sí?
Gracias
Respuesta1
Te estás confundiendo mucho con las extensiones de nombre de archivo. No existe tal cosa. No desde MS-DOS y CPM. Windows de Microsoft todavía los usa para activar acciones en el explorador de archivos, pero son solo parte del nombre del archivo.
Por lo tanto stdout
y stdout.fq
son archivos diferentes. También el nombre de stdout
es /dev/stdout
y stdin
es/dev/stdin
Respuesta2
Depende de cómo reformat.sh
esté escrito.
A menudo, los comandos de UNIX usarán stdin y stdout si no les proporciona ninguna entrada/salida:
reformat.sh in=test.bam primaryonly |
reformat.sh out1=r1.fq.gz out2=r2.fq.gz interleaved addcolon
Otras veces aceptarán - como nombre de archivo:
reformat.sh in=test.bam out=- primaryonly |
reformat.sh in=- out1=r1.fq.gz out2=r2.fq.gz interleaved addcolon
En Bash moderno puedes usar /dev/stdin
y /dev/stdout
:
reformat.sh in=test.bam out=/dev/stdout primaryonly |
reformat.sh in=/dev/stdin out1=r1.fq.gz out2=r2.fq.gz interleaved addcolon
Para evitar nombres conflictivos al ejecutar trabajos en paralelo, crearía una función que tome los nombres como argumentos:
refo() {
in="$1"
out1="$2"1.fq.gz
out2="$2"2.fq.gz
reformat.sh in=/dev/stdin out=/dev/stdout primaryonly |
reformat.sh in=/dev/stdin out1="$out1" out2="$out2" interleaved addcolon
}
Y lo llamamos así:
refo test.bam out
Cuando eso funcione, puedes paralelizar varios bam
archivos con:
export -f refo
parallel refo {} {.} ::: *.bam