2012-03-13 60 views
2

我有一個程序可以以兩種方式運行:單端或雙端模式。以下是語法:更改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中用快速的正則表達式替換來完成此操作。但我希望能夠用快速的一行內容來做到這一點。

在此先感謝。

回答

1

我在Perl中用快速正則表達式替換完成了這項工作。但我希望能夠用快速的一行內容來做到這一點。

Perl也有一行,就像sedawk一樣。你可以寫:

find . -name "sample*_1.txt" | perl -pe 's/_1\.txt$//' | parallel program {}-out {}_1.txt {}_2.txt 

(該-e標誌的意思是「下一個參數是程序文本」;在-p標誌意味着「程序應該在循環運行;對於輸入的每一行,設置$_到該行,然後運行該程序,然後打印$_」)

+0

我喜歡這個答案最好,因爲它可以與xargs或parallel並行。感謝您的建議,以及有關-p和-e正在做什麼的解釋。看起來我也可以用sed's/_1 \ .txt // g'做同樣的事情。現在看起來很明顯。謝謝。 – 2012-03-13 17:42:57

+0

@StephenTurner:不客氣! – ruakh 2012-03-13 17:43:25

0

假設你總是有正好2個文件在目錄中的每對假設他們得到的排序條件爲find以正確的方式(這可以通過find管道結果通過sort保證),也許會xargs -l 2做的工作。這告訴xargs在其執行的每個命令行上放置2個連續的傳入參數。

1

隨着sedxargs你可以做這樣的事情:

find . -name "sample*_1.txt" | sed -n 's/_1\..*$//;h;s/$/_out/p;g;s/$/_1.txt/p;g;s/$/_2.txt/p' | xargs -L 3 echo program 

即:sed創建三個參數和xargs -L 3組成具有三個參數的命令行。

0

一個較短的版本:

parallel --xapply program {1.}.out {1} {2} :::: <(ls *_1.txt) <(ls *_2.txt) 

但如果每個_1.txt有一個匹配的_2.txt反之亦然這僅適用。