2017-06-05 45 views
0

我想运行一个需要几个参数的命令行脚本。具体做法是:如何将多个输入流用于输入参数?

perl的prinseq-lite.pl -fastq file1.fq.gz -fastq2 file2.fq.gz

\ -out_good goodfile.out -out_bad badfile.out -log prin.log

\ -ns_max_n 5 ... ... more_params

的问题是,该文件是压缩的,且必须先解压缩并存储它们进行处理,因为解压缩后的文件大小是非常大的,这个命令将在大量文件上运行。

所以我需要做的是解压缩输入。以前,用户l0b0建议多个输入流可能是一个解决方案。我已经尝试了以下内容,但是由于该程序声称输入文件是空的,所以似乎在这里传递了一个空输入流。

perl的prinseq-lite.pl -fastq <(ZCAT f1.gz)-fastq2 <(ZCAT f2.gz)...

perl的prinseq-lite.pl -fastq 1 < <(ZCAT f1.gz)-fastq2 2 < <(ZCAT f2.gz)...

所以我需要做的,总之,是多个参数,该程序提供解压的输入。

有人可以告诉我这样做的正确方法,和/或我做错了我目前的尝试?预先感谢您的意见。

+1

令人怀疑他们是*空*。然而,他们将会是*不可搜寻*;如果你的'prinseq-lite.pl'需要能够在文件内部寻找或者多次读取它,那*会是一个问题。 –

+1

......这就是说,我们实际上需要更多关于您的特定Perl脚本的内容来很好地回答这个问题。 –

+0

(同样,如果你的程序试图读取输入文件的长度,以提供状态信息,*那将*失败过,我能看到的东西写草率处理,同样为空)。 –

回答

0

嗯,我认为最简单的可能是使命名管道的gzunip输出,然后在命令中使用这些名称管道:

mkfifo file1.fq file2.fq file3.fq ... 
gunzip -c file1.fq.gz > file1.fq & 
gunzip -c file2.fq.gz > file2.fq & 
gunzip -c file3.fq.gz > file3.fq & 

然后用这些管道调用程序的文件名:

perl prinseq-lite.pl -fastq file1.fq -fastq2 file2.fq -fastq3 file3.fq ... 
+2

如果'<(...)'不起作用,如果命名管道可以工作,我会感到惊讶。在许多平台上,shell由一个命名管道替换进程替换*;在其他国家,它会像'的/ dev/FD/10'指向一个匿名管道 - 但大部分会使程序的限制,无法用'的/ dev/fd'指向一个匿名管道将使它也失败了一个命名管道。 –

+0

不会使用命名管道将文件解压缩到文件系统,就像解压缩文件并将解压缩文件提供给程序一样? –

+0

不,@AdamPrice,它实际上并没有写入文件系统。这一切都在记忆中。 – Jack