awk没有在perl脚本中工作?

时间:2015-02-24 10:10:38

标签: perl awk

我试图在perl脚本中执行下面的awk命令,但它失败了。

#!/usr/bin/perl

print `awk -F, '{print $NF}' f1.txt > f2.txt`

这是错误:

syntax error at ./MO.pl line 3, near "print"
Execution of ./MO.pl aborted due to compilation errors.

任何人都可以帮助我在这里做错了吗?

3 个答案:

答案 0 :(得分:2)

这是一个Perl错误,与您的awk脚本本身无关。当上一个语句末尾没有分号时,通常会看到错误。

这是一个非常简单的程序(应包括use strict;use warnings;,但我想模仿你所拥有的程序。)

#! /usr/bin/env perl
#

print "Hello, World\n"  # Line 4
print "Hello, Back\n";  # Line 5

错误信息是:

syntax error at test.pl line 5, near "print"
Execution of test.pl aborted due to compilation errors.

请注意,错误是 第5行中的print,但错误实际上是在第4行的末尾,我错过了分号。

运行您的确切程序适用于我的系统(虽然没有产生您想要的结果)。我假设这不是你的确切程序,而是简化你的程序。在print之前是否有声明?

其他几件事:

  • 您正在重定向awk输出,因此print没有任何内容。
  • 使用严格警告
  • 最好使用qx(....)而不是反叛(重音符号)。它更具可读性,允许您在带引号的可执行文件中使用引用的可执行文件。
  • 在代码中注意Perlisms。 $NF由Perl解释,如果没有use strict;,则不会给您一个错误。相反,您的Awk语句中的print是一个打印整行的空打印。
  • 如果没有打印出来,为什么要使用print?你最好在这个位置上使用system,它允许你在整个陈述中加上单引号:

    system q(awk -F, '{print $NF}' f1.txt > f2.txt);

    这样,$NF不必引用。

  • 为什么你在Perl程序中执行Awk? Perl会做任何事情都会做,并且做得更好:

这是您的程序版本,使用普通的'的Perl:

#! /usr/bin/env perl

use strict;
use warnings;
use autodie;

while ( my $line = <> ) {
    my @array = split /\s*,\s*/, $line;
    print $array[-1];
}

要运行此程序:

$ test.pl f1.txt > f2.txt

是的,它的时间更长,但是pragmas所有Perl程序都应该使用该程序的一半。

我确信比我聪明的人可以把它变成Perl单行。

答案 1 :(得分:1)

由于您正在重定向awk输出,因此perl无法打印。您也可以使用systemquoting operator q()

system q(awk -F, '{print $NF}' f1.txt > f2.txt)

或者,当然,在perl中执行它,这可以使您不必生成shell然后生成awk:

open my $in, '<', 'f1.txt';
open my $out, '>', 'f1.txt';
while (<$in>) {
    print $out (split " ")[-1], "\n";
}
close $in;
close $out;

答案 2 :(得分:0)

如果脚本中有更多行,则需要在print语句的末尾加分号。