2017-01-31 61 views
-2

我有以下的Perl腳本(儘管這適用於Python和其他腳本語言):script1.plscript2.plscript3.pl在不重寫Python/Perl腳本的情況下,我將如何將輸出一起輸出到bash腳本中?

這些腳本是書面的方式,用戶輸入的標誌執行它們,並且輸出保存的文件。

perl script1.pl --i input1.tsv ## this outputs the file `outputs1` 
perl script2.pl --i outputs1  ## this outputs the file `outputs2` 
perl script3.pl --i outputs2  ## this outputs the file `final_output` 

(對於Pythonistas,這是python script1.py

現在,我想創建一個可執行bash腳本,讓用戶只需用input1工作,並得到輸出的回報final_output

這是我怎麼會只有一個perl腳本爲此,execute.sh

#!/bin/sh 

source ~/.bash_profile 

FLAG1="--i=$1" 

perl script1.pl $FLAG1 

它可以在命令行execute.sh input1.tsv

與三個腳本運行在我的例子中,我如何管中間輸出到中間腳本中以創建一個execute.sh腳本,例如outputs1分成script2.pl,然後outputs2分成scripts3.pl等?

有沒有一種方法可以讓我在不重寫perl/python腳本的情況下執行此操作?

編輯:其他信息:問題是我其實不知道輸出是什麼。文件名稱根據原始的inputs1.tsv進行更改。現在,我確實知道輸出的文件擴展名。但是outputs1和outputs2具有相同的文件擴展名。

+0

通過調用具有正確文件名的腳本,與手動執行腳本相同,除了它在腳本中。沒有神奇的東西。 – hobbs

+0

腳本是否需要特定的輸入/輸出文件?通常情況下,您只需將它們組合爲' outputs2'(並編寫腳本,當然可以) – Ryan

+1

如果腳本始終輸出爲硬連接的文件名,則除了更改腳本之外別無它法。 – choroba

回答

0

這種情況的最佳實踐是讓腳本從標準輸入讀取並寫入標準輸出。在這種情況下,它變得非常容易管他們在一起,就像這樣:

perl script1.pl < input1.tsv | perl script2.pl | perl script3.pl 

在你的情況,你可以寫一個這樣的腳本:

#!/bin/sh 
perl script1.pl --i input1.tsv 
perl script2.pl --i outputs1 
perl script3.pl --i outputs2 

這並不理想,但它會做你想要什麼。它將讀取input1.tsv,並寫入outputs3。

+0

「在你的情況下,你可以寫這樣的腳本」見上面的評論。問題是我其實不知道輸出是什麼。文件名稱根據原始的inputs1.tsv進行更改。現在,我確實知道輸出的文件擴展名。但是outputs1和outputs2具有相同的文件擴展名。 – ShanZhengYang

+0

'perl script1.pl ShanZhengYang

+0

我在說的是,如果你有機會從頭開始編寫它,我建議寫它,以便從標準輸入讀取並寫入標準輸出 - 然後你將不會對文件名有任何限制。如果您不知道並且無法預測各種腳本的輸出文件的名稱,則很難自動化。您可以執行諸如捕獲目錄中所有文件的名稱,運行腳本,再次捕獲名稱以及查看更改內容等內容。這有點可笑,但它聽起來像你可能沒有很多更好的選擇... –

-1

你的問題不說,但是假設你可以使用--o標誌指定輸出文件:

perl script1.pl --i input1.tsv --o /dev/stdout | perl script2.pl --i /dev/stdin --o /dev/stdout | perl script3.pl --i /dev/stdin --o final_output 

/dev/stdin/dev/stdout是寫入過程分別stdinstdout神奇的UNIX文件。

+0

不幸的是,我將不得不寫一個'--o'國旗 – ShanZhengYang

+0

是的,如果腳本只是硬編碼給一些文件名,那麼你幾乎搞砸了! –