Programa apenas funciona em um terminal

0

Estou executando este comando em duas pastas diferentes e em dois terminais diferentes:

for i in *_RG.bam; do k='echo $i | sed  "s/.bam/_Reordered.bam/"' java -jar /home/Programas/picard-tools-1.107/ReorderSam.jar R=/local/Referencias/Homo_sapiens/UCSC/hg19/Sequence/Bowtie2Index/genome.fa  I= $i O= "$k" ; done

Em um terminal funciona bem, mas no outro terminal o código não está funcionando. Dá o próximo erro.

Runtime.totalMemory()=1517289472
To get help, see http://picard.sourceforge.net/index.shtml#GettingHelp
Exception in thread "main" net.sf.samtools.util.RuntimeIOException: File not found: 
    at net.sf.samtools.util.BinaryCodec.<init>(BinaryCodec.java:102)
    at net.sf.samtools.util.BlockCompressedOutputStream.<init>(BlockCompressedOutputStream.java:127)
    at net.sf.samtools.BAMFileWriter.<init>(BAMFileWriter.java:50)
    at net.sf.samtools.SAMFileWriterFactory.makeBAMWriter(SAMFileWriterFactory.java:154)
    at net.sf.samtools.SAMFileWriterFactory.makeBAMWriter(SAMFileWriterFactory.java:136)
    at net.sf.samtools.SAMFileWriterFactory.makeSAMOrBAMWriter(SAMFileWriterFactory.java:246)
    at net.sf.picard.sam.ReorderSam.doWork(ReorderSam.java:118)
    at net.sf.picard.cmdline.CommandLineProgram.instanceMain(CommandLineProgram.java:179)
    at net.sf.picard.cmdline.CommandLineProgram.instanceMainWithExit(CommandLineProgram.java:120)
    at net.sf.picard.sam.ReorderSam.main(ReorderSam.java:77)
Caused by: java.io.FileNotFoundException:  (No such file or directory)
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:221)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:171)
    at net.sf.samtools.util.BinaryCodec.<init>(BinaryCodec.java:95)
    ... 9 more

Quando eu chamo o programa como java -jar /home/ktroule/Programas/picard-tools-1.107/ReorderSam.jar -h em um novo terminal, ele imprime a ajuda como seria de esperar.

Depois disso parei de usar ctrl+c do terminal que estava funcionando corretamente e troquei os terminais para comprovar se o problema estava relacionado aos arquivos ou ao terminal. E o mesmo aconteceu, apenas um terminal funcionou (o mesmo que estava trabalhando anteriormente). Fechei o terminal que não estava funcionando e abri um novo, mas somente no original o código funciona.

Eu também comparei no terminal que funciona e o que não produz o printenv por usinf diff e ambos são as mesmas exceções para a linha WINDOWID .

Algum palpite sobre o problema?

Não estou fechando o terminal que executa o código quando preciso e tenho medo de não conseguir executar o código.

    
por HeyHoLetsGo 10.02.2016 / 16:22

1 resposta

2

Ponto e vírgula ausente após atribuição a k , k=...

No seu primeiro terminal, você provavelmente fez alguns testes antes, como:

k='echo blah_RG.bam | sed  "s/.bam/_Reordered.bam/"'
echo $k

Agora, k está definido no seu shell.

Quando você expandi-lo para incluir o processamento Java, o arquivo de saída será aquele $k .

Então você abre um novo Terminal. Aqui $k não está definido. Então você tenta executar o mesmo comando, mas, como $k não está configurado, o programa Java reclama do arquivo de saída não encontrado. O= "$k" seria O= ""

Isso também corresponde às mensagens de erro que mencionam vários ...Writer e FileOutput... em oposição a ...Reader e > FileInput... . Simplesmente não é possível abrir um arquivo sem / nome vazio.

Quanto à comparação de printenv ou env , observe que esse comando não inclui variáveis do shell. Dê uma olhada em, e. (set -o posix; set)

Amostra simples:

$ touch 1.foo 2.foo 3.foo
$ for i in *.foo; do k="$(echo $i | sed 's/.foo/.bar/')"; done

# Now k is set to last *.foo

$ for i in *.foo; do k="$(echo $i | sed 's/.foo/.bar/')" printf "i=%s k=%s\n" "$i" "$k"; done
i=1.foo k=3.bar
i=2.foo k=3.bar
i=3.foo k=3.bar

Em seguida, tente com ; após a atribuição a $k :

$ for i in *.foo; do k="$(echo $i | sed 's/.foo/.bar/')"; printf "i=%s k=%s\n" "$i" "$k"; done
i=1.foo k=1.bar
i=2.foo k=2.bar
i=3.foo k=3.bar

Você pode alterá-lo para algo como:

for fn in *_RG.bam
do
    printf "Processing: %s\n" "$fn"

    java -jar /home/Programas/picard-tools-1.107/ReorderSam.jar \
    R=/local/Referencias/Homo_sapiens/UCSC/hg19/Sequence/Bowtie2Index/genome.fa \
    I="$fn" O="${fn%.bam}_Reordered.bam"
done

Nota: aqui como multi-linha e com o uso de substituição de bash:

  ${fn%.bam}_Reordered.bam
    | |  |    |
    | |  |    +--------- Append _Reordered.bam
    | |  +-------------- Remove .bam
    | +----------------- Remove substring from end
    +------------------- Variable name
    
por 10.02.2016 / 17:02

Tags