2017-10-13 23 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,或者至少需要几天时间,而且我之前需要它。 –