saída de stdout e stdin para vários arquivos em execução simultaneamente

saída de stdout e stdin para vários arquivos em execução simultaneamente

Eu tenho o seguinte comando que funciona em um arquivo 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

A ideia aqui é evitar gravar a saída do primeiro comando (reformat.sh) em um arquivo, o que aumenta a velocidade geral.

Tenho vários arquivos bam em meu diretório de trabalho atual e quero executá-los no cluster em paralelo. Como posso usar stdout.fq e stdin.fq no comando acima para que, quando vários arquivos bam estiverem sendo processados ​​simultaneamente, stdout.fq/stdin.fq não interfira um no outro?

Obrigado

Responder1

Você está ficando muito confuso com extensões de nome de arquivo. Não existe tal coisa. Não desde o MS-DOS e o CPM. O Windows da Microsoft ainda os usa para acionar ações no explorador de arquivos, mas eles são apenas parte do nome do arquivo.

Portanto stdoute stdout.fqsão arquivos diferentes. Além disso, o nome de stdouté /dev/stdoute stdiné/dev/stdin

Responder2

Depende de como reformat.shestá escrito.

Freqüentemente, os comandos UNIX usarão stdin e stdout se você não fornecer nenhuma entrada/saída:

reformat.sh in=test.bam primaryonly |
  reformat.sh out1=r1.fq.gz out2=r2.fq.gz interleaved addcolon

Outras vezes eles aceitarão - como nome de arquivo:

reformat.sh in=test.bam out=- primaryonly |
  reformat.sh in=- out1=r1.fq.gz out2=r2.fq.gz interleaved addcolon

No Bash moderno você pode usar /dev/stdine /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 nomes conflitantes ao executar trabalhos em paralelo, eu construiria uma função que aceita os nomes 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
}

E a chamada é assim:

refo test.bam out

Quando isso funcionar, você pode paralelizar vários bamarquivos com:

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

informação relacionada