2017-10-13 55 views
1

,當我手動運行,但是當我把它使用反引號或系統命令的Perl腳本,它給這個錯誤調用從perl的awk不工作,解壓縮重定向

SH下面的命令正常工作: - C:0行:附近意外的標記語法錯誤'(」

腳本快照:

#Find contents of myFile in zipfile and output the matched records to output.txt 
$cmd = "awk -F\"|\" 'NR==FNR{hash[\$0]=1;next} \$237 in hash' $myFILE <(unzip -p $zipfile *XYZ*) >> output.txt"; 
$result=`$cmd`; 

看來,我們不能稱之爲內作爲一個子shell即(解壓...) ystem通過Perl調用。請告訴我,因爲幾天以來我一直在掙扎。

+4

好悲傷......難怪這是一場鬥爭。誰會讓所有這些逃脫權利。爲什麼這個'awk'?通過這種方式,你可以使用反引號(shell),然後運行一個命令(awk,你需要對其進行轉義),在該shell的子shell中運行另一個程序(解壓縮,你需要轉義)。 ..爲什麼不在Perl中處理(解壓縮返回的)所有的處理,如果腳本是在Perl中? – zdim

+0

'<(...)'無效'sh'語法 – ikegami

+0

如果您重新確定您的輸入和輸出是什麼,那麼我們將給您一個perl的答案,這個答案既簡單又不脆弱。但是,爲什麼不使用其中一個perl模塊做 – Sobrique

回答

0

這是因爲命令行很可能是/ bin/bash,而perl的shell是/ bin/sh,它不支持這種意思。將管道(|)放在awk前面的zip命令。類似這樣的:

#Find contents of myFile in zipfile and output the matched records to output.txt 
$cmd = "unzip -p $zipfile *XYZ* | awk -F\"|\" 'NR==FNR{hash[\$0]=1;next} \$237 in hash' $myFILE >> output.txt"; 
$result=`$cmd`; 
+0

或者更好 - 不要內聯awk,因爲您可以在perl中完成所有操作,並且不會出現問題。 – Sobrique

+0

@niry - 我已經嘗試過,並沒有奏效。 –

+0

@sobrique - 我無法在perl中安裝unzip/zip包,因爲它是我客戶端的受保護env,或者至少需要幾天時間,而且我之前需要它。 –