Perl:如何从变量获取awk输出

时间:2014-06-26 11:53:50

标签: perl

我收到awk的语法错误。

value = a|b|c|d|e|F|g|h 

my $record =  `$value | awk -F "|" '{print $5}'`;

谢谢,

3 个答案:

答案 0 :(得分:3)

试试这个:

 my $record = ( split /\|/, 'a|b|c|d|e|F|g|h' )[4];

使用$value

my $record = ( split /\|/, $value )[4];

或者甚至是这样:

my ( undef, undef, undef, undef, $record )  = split /\|/, $value;

攻击到拆分,就像没有尝试过Perl一样。

答案 1 :(得分:3)

如果你曾经试图从Perl调用awk,那么你几乎肯定会做错事。 Perl几乎可以完成awk可以做的所有事情 - 并且更高效,更便携地完成。

my $value = 'a|b|c|d|e|F|g|h';

my $record =  (split /\|/, $value)[4]; # 4, not 5 as Perl arrays are zero-indexed

答案 2 :(得分:1)

如果您处于shell提示符下,则使用以下命令:

echo 'a|b|c|d|e|F|g|h' | awk -F "|" '{print $5}'

但是你正在执行以下操作(假设Perl的$5未初始化):

a|b|c|d|e|F|g|h | awk -F "|" '{print }'

(当你注意到它没有工作时,你没有尝试打印出你正在执行的命令吗?)

修正:

use String::ShellQuote qw( shell_quote );

my $cmd = shell_quote('echo', $value)
   .      ' | '
   .      shell_quote('awk', '-F', '|', '{print $5}');

my $fifth_field = `$cmd`;

当然,使用split和列表切片要简单得多。

my $fifth_field = ( split /\|/, $value )[4];