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 stdout
e stdout.fq
são arquivos diferentes. Além disso, o nome de stdout
é /dev/stdout
e stdin
é/dev/stdin
Responder2
Depende de como reformat.sh
está 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/stdin
e /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 bam
arquivos com:
export -f refo
parallel refo {} {.} ::: *.bam