我在两个不同的文件夹和两个不同的终端中执行此命令:
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
在一个终端上它工作正常,但在另一个终端上代码根本不工作。它给出了下一个错误。
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
当我在新终端中调用该程序时java -jar /home/ktroule/Programas/picard-tools-1.107/ReorderSam.jar -h
,它会按照我的预期打印帮助。
此后,我停止使用ctrl+c
正常工作的终端,并交换终端以证明问题是否与文件或终端有关。同样的情况也发生了,只有一个终端可以工作(与之前的终端相同)。我关闭了无法工作的终端并打开了一个新终端,但代码仅在原始终端上有效。
我还比较了有效的终端和不通过 usinf 输出 printenv 的终端diff
,两者都是相同的(除了该WINDOWID
行)。
对这个问题有什么猜测吗?
我不会根据需要关闭运行代码的终端,而且我担心无法运行代码。
答案1
分配给后缺少分号k,k=...
在您的第一个终端中,您可能事先做了一些测试,例如:
k=`echo blah_RG.bam | sed "s/.bam/_Reordered.bam/"`
echo $k
现在k
已在您的 shell 中设置。
然后,当您将其扩展以包含 Java 处理时,输出文件将是$k
.
然后你打开一个新的终端。这里$k
没有设置。然后您尝试运行相同的命令,但是,由于$k
未设置,Java 程序会抱怨找不到文件。O= "$k"
将会O= ""
这也与提到各种的错误消息相匹配...Writer
和FileOutput...
相对于...Reader
和FileInput...
。它根本无法打开没有/空名称的文件。
至于比较printenv
或env
注意该命令不包含 shell 变量。看看例如(set -o posix; set)
简单示例:
$ 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
;
然后在分配给之后尝试$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
您可以将其更改为类似以下内容:
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
笔记:这里是多行并使用 bash 替换:
${fn%.bam}_Reordered.bam
| | | |
| | | +--------- Append _Reordered.bam
| | +-------------- Remove .bam
| +----------------- Remove substring from end
+------------------- Variable name