2013-01-18 34 views
0

嘗試通過粘貼命令對壓縮文件使用進程替換時出現錯誤。Bash:通過進程替換粘貼錯誤

我試圖打開100個壓縮文件並粘貼第二列。

當我嘗試:

for name in $(ls FILEPATH/*.gz); do 
temp=${temp}" <(zcat "${name}" | cut -f2)"; done 

paste ${temp} > DESTINATION/OUTPUTNAME' 

我得到的錯誤

paste: invalid option -- f 

當我嘗試粘貼$(echo ${temp}),而不是paste ${temp},我得到了同樣的問題,但是當我echo ${temp}到我的終端和手動複製並粘貼到粘貼的響應,它的工作原理。

請幫我解決這個問題。

+0

你可以將'echo $ {temp}'的輸出添加到你的poste中嗎? – Steve

+0

'paste'獲取文件名列表。你的'.gz'文件是否在第二列中包含文件名?如果是這樣,那麼所有這些文件名都以'-'開頭,所以'paste'認爲這是一個選項? –

+0

這就是echo $ {temp}輸出的樣子:<(zcat /FILEPATH/file1.gz)<(zcat /FILEPATH/file2.gz | cut -f2)... up to 100. 沒有行任何文件都以「 - 」開頭。第2列是一個域或一個數字。 – user1382685

回答

0

好吧我懷疑正在發生的事情是這樣的:

臨時變量擴展爲您gzip壓縮文件檢索來回的文件名列表。

如果字符串' - '存在,告訴粘貼它應該停止解析命令行中的選項,並且在 - 之後的所有內容都是要使用的文件。

如果其中一個文件名開始-f那麼你會得到你的錯誤。

嘗試

paste -- ${temp} > DESTINATION/OUTPUTNAME 

編輯:

從註釋

好下面它看起來像你的bash版本支持重定向。

最初的錯誤是由貓的-f2標誌引起的。

嘗試 呼應<(LS)

,如果你得到像/ dev/FD /然後處理substituion工作的結果,我很困惑,發生了什麼事,但我懷疑你不會得到那個。

+0

我試過粘貼 - $ {temp}並且被賦予錯誤=粘貼:<(zcat:沒有這樣的文件或目錄 – user1382685

+0

@ user1382685認爲我找到了問題。 – peteches

0

問題是,您不能嵌入shell語法,如「<(...)」和「|」在字符串中,因爲命令行的那些部分在參數擴展發生之前被識別。您在temp中放入的所有內容均被視爲paste的簡單字符串參數。

有沒有簡單的方法來完成你正在嘗試。我毫不猶豫地提到它,但我認爲你需要使用eval

# Simpler than writing a loop 
printf -v temp "<(zcat %s | cut -f2) " FILEPATH/*.gz 

eval "paste $temp > DESTINATION/OUTPUTNAME"