如何在 Perl 中正确调用 awk 来打印出一行中的倒数第三个字段?

如何在 Perl 中正确调用 awk 来打印出一行中的倒数第三个字段?

我的脚本是:

#!/usr/bin/perl -w

my $line="1 2 3 4 5 6 7";
print $line;
my $thirdlast=`print $line |awk '{print $(NF-3)}'`;
print $thirdlast;

输出为:

1 2 3 4 5 6 7   awk: 0602-542 There is an extra ) character.
 The source line is 1.
 The error context is
                {print 201 1 >>>  201NF-3) <<< 
 Syntax Error The source line is 1.
 awk: 0602-502 The statement cannot be correctly parsed. The source line is 1.
        awk: 0602-542 There is an extra ) character.

它在抱怨什么?我的脚本有什么问题吗?不明白为什么它会说The source line is 1

我的脚本需要修复什么?

答案1

您不需要在程序awk内部调用perlperl提供执行此类操作所需的函数:

#!/usr/bin/perl -w

my $line="1 2 3 4 5 6 7";
my @tab = split(/\s+/, $line);
print $tab[-3],"\n";

这个小程序输出:5

答案2

Sylvain 指出,您实际上不需要awk从内部调用perl,因为后者可以执行前者可以执行的任何操作。但是,要回答您的原始问题,您需要 i) 转义内部$awkii) 正确将您的 Perl 变量传递给您启动的子 shell(print在 shell 中是完全不同的东西)。类似于:

#!/usr/bin/perl -w

my $line="1 2 3 4 5 6 7";
## Use echo, not print and escape the $ in $(NF-3)
my $thirdlast=`echo "$line" |awk '{print \$(NF-3)}'`;
print $thirdlast;

答案3

可以这样做同样cut的事情:

cut -d ' ' -F <field>

相关内容