2017-06-05 43 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