从perl调用awk不适用于解压重定向

从perl调用awk不适用于解压重定向,perl,awk,Perl,Awk,当我手动运行下面的命令时,它工作得很好,但是当我使用backticks或system命令从perl脚本调用它时,它给出了这个错误 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 &l

当我手动运行下面的命令时,它工作得很好,但是当我使用backticks或system命令从perl脚本调用它时,它给出了这个错误

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`;
#在zipfile中查找myFile的内容,并将匹配的记录输出到output.txt
$cmd=“awk-F\”|\“'NR==FNR{hash[\$0]=1;下一个}\$237在hash'$myFILE>output.txt中”;
$result=`$cmd`;

似乎我们无法通过perl在系统调用中调用子shell,即(unzip…)。请给出建议,因为我从几天以来一直在努力工作。

这是因为命令行很可能是/bin/bash,perl的shell是/bin/sh,它不支持这一意思。请将zip命令放在awk with pipe(|)之前.大概是这样的:

#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`;

这是因为命令行很可能是/bin/bash,而perl的shell是/bin/sh,它不支持这个意思。请将zip命令放在awk with pipe(|)之前。类似于以下内容:

#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`;

好悲伤…难怪这是一场斗争。谁能把所有的转义都做好。为什么会这样呢
awk
?这样你就可以退出(用反勾号),然后运行一个命令(awk,你需要退出),在这个shell的子shell中运行另一个程序(解压,你需要退出),带重定向…为什么不做所有处理(解压返回)在Perl中,如果脚本是用Perl编写的?
如果您将问题重新定义为输入和输出到底是什么,我们将为您提供一个只使用Perl的答案,这个答案既简单又不那么脆弱。但是,为什么不改为使用各种Perl模块中的一个来完成这项工作呢?谢谢您的回答。我不想在其中添加程序包perl@NaineshVashi我没有暗示使用包。重复:调用
解压(Perl)脚本并在该(Perl)脚本中处理其输出。使用Perl的(极好的)本机文本处理功能,而不是使用
awk
(我的想法是:您有一个使用
awk
的命令行,可以运行,并且您希望“使用它”在脚本中;但这会使它变得更难、更容易出错、更脆弱。而且很尴尬。)好的悲伤…难怪这是一场斗争。谁会把所有的转义都做好。为什么会这样呢
awk
?这样你就可以退出(使用backticks),然后运行一个命令(awk,你需要为它转义),在该shell的子shell中运行另一个程序(解压,为此您需要转义),并进行重定向…为什么不进行所有处理(解压的返回)在Perl中,如果脚本是用Perl编写的?
如果您将问题重新定义为输入和输出到底是什么,我们将为您提供一个只使用Perl的答案,这个答案既简单又不那么脆弱。但是,为什么不改为使用各种Perl模块中的一个来完成这项工作呢?谢谢您的回答。我不想在其中添加程序包perl@NaineshVashi我没有暗示使用包。重复:调用
解压(Perl)脚本并在该(Perl)脚本中处理其输出。使用Perl的(极好的)本机文本处理功能,而不是使用
awk
(我的想法是:您有一个使用
awk
的命令行,可以运行,并且您希望“使用它”在脚本中;但这使它变得更加困难、容易出错和脆弱。而且很尴尬。)或者更好-不要内联awk,因为您可以用perl完成所有工作,并且不会出现转义问题。@sobrique-我无法用perl安装解压/压缩包,因为它是我客户机的受保护环境,或者至少需要几天时间,我需要它。perl以本机方式完成大部分工作。您可能需要的唯一一个模块是读取zip文件。但是l模块也可以安装在用户上下文中。或者更好的是-不要内联awk,因为您可以用perl完成所有工作,并且不会出现转义问题。@sobrique-我不能用perl安装解压/压缩包,因为它是我客户机的受保护环境,或者至少需要几天时间,我需要它。perl会以本机方式完成大部分工作。唯一可以做的事情是不需要一个模块来读取zip文件,但是perl模块也可以安装在用户上下文中。