generar stdout y stdin para múltiples archivos que se ejecutan simultáneamente

generar stdout y stdin para múltiples archivos que se ejecutan simultáneamente

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 stdouty stdout.fqson archivos diferentes. También el nombre de stdoutes /dev/stdouty stdines/dev/stdin

Respuesta2

Depende de cómo reformat.shesté 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/stdiny /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 bamarchivos con:

export -f refo
parallel refo {} {.} ::: *.bam

información relacionada