我试图在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.
任何人都可以帮助我在这里做错了吗?
答案 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(....)
而不是反叛(重音符号)。它更具可读性,允许您在带引号的可执行文件中使用引用的可执行文件。$NF
由Perl解释,如果没有use strict;
,则不会给您一个错误。相反,您的Awk语句中的print
是一个打印整行的空打印。如果没有打印出来,为什么要使用print
?你最好在这个位置上使用system
,它允许你在整个陈述中加上单引号:
system q(awk -F, '{print $NF}' f1.txt > f2.txt);
这样,$NF
不必引用。
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无法打印。您也可以使用system
和quoting 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语句的末尾加分号。