我有一個程序可以以兩種方式運行:單端或雙端模式。以下是語法:更改xargs(或GNU並行)參數中的文本
program <output-directory-name> <input1> [input2]
其中輸出目錄和至少一個輸入是必需的。如果我想就三個文件運行它,比如說,樣品A,B和C,我會使用類似與xargs的或平行發現:
[email protected]:~/single$ ls
sampleA.txt sampleB.txt sampleC.txt
[email protected]:~/single$ find . -name "sample*" | xargs -i echo program {}-out {}
program ./sampleA.txt-out ./sampleA.txt
program ./sampleB.txt-out ./sampleB.txt
program ./sampleC.txt-out ./sampleC.txt
[email protected]:~/single$ find . -name "sample*" | parallel --dry-run program {}-out {}
program ./sampleA.txt-out ./sampleA.txt
program ./sampleB.txt-out ./sampleB.txt
program ./sampleC.txt-out ./sampleC.txt
但是,當我想在「paired-運行程序結束「模式,我需要給它兩個輸入。這些是相關的文件,但不能簡單地將它們連接起來 - 您必須將兩個程序都作爲輸入運行。文件命名合理,例如sampleA_1.txt和sampleA_2.txt。
我希望能夠在命令行上的東西,如xargs的輕鬆創建這個(或優選平行):
[email protected]:~/paired$ ls
sampleA_1.txt sampleB_1.txt sampleC_1.txt
sampleA_2.txt sampleB_2.txt sampleC_2.txt
[email protected]:~/paired$ find . -name "sample*_1.txt" | sed/awk? | parallel ?
program ./sampleA-out ./sampleA_1.txt ./sampleA_2.txt
program ./sampleB-out ./sampleB_1.txt ./sampleB_2.txt
program ./sampleC-out ./sampleC_1.txt ./sampleC_2.txt
理想情況下,該命令會剝去_1.txt以創建輸出目錄名稱(sampleA-out等),但我真的需要能夠採用該參數並將_1更改爲第二個輸入的_2。
我知道這是用腳本簡單死了 - 我在Perl中用快速的正則表達式替換來完成此操作。但我希望能夠用快速的一行內容來做到這一點。
在此先感謝。
我喜歡這個答案最好,因爲它可以與xargs或parallel並行。感謝您的建議,以及有關-p和-e正在做什麼的解釋。看起來我也可以用sed's/_1 \ .txt // g'做同樣的事情。現在看起來很明顯。謝謝。 – 2012-03-13 17:42:57
@StephenTurner:不客氣! – ruakh 2012-03-13 17:43:25