Awk在Perl中的输出似乎不能正常工作

时间:2018-06-04 12:17:45

标签: perl awk

我正在编写一个简单的Perl脚本,用于输出外部文本文件的第二列(第一列和第二列用逗号分隔)。

我正在使用AWK,因为我对它很熟悉。

这是我的剧本:

use v5.10;
use File::Copy;
use POSIX;

$s = `awk -F ',' '\$1==500 {print \$2}' STD`;
say $s;

本地文件“STD”的内容是:

CIR,BS  
60,90
70,100
80,120
90,130
100,175
150,120
200,260
300,500
400,600
500,850
600,900

我的输出非常奇怪,它打印出所需的“850”,但它也打印了该行的预告片和新行!

ka@man01:$ ./test.pl 
850

ka@man01:$

问题不仅仅是打印。我需要使用awk生成的变量“即$ s变量”,但变量也是用长字符串和新行保留的!

你能帮忙吗?

谢谢。

3 个答案:

答案 0 :(得分:2)

我建议您首先尝试将awk内联到perl,以便走上肮脏的道路。为什么不改为:

open ( my $input, '<', 'STD' ) or die $!;
while ( <$input> ) {
    s/\s+\z//;
    my @fields = split /,/; 
    print $fields[1], "\n" if $fields[0] == 500; 
} 

但可能的问题是您没有处理换行符,say正在添加额外的换行符。请尝试使用print,或chomp对结果字符串。

答案 1 :(得分:1)

perl 可以执行 awk 可以执行的许多操作。这里有类似的东西取代了你的整个Perl程序:

$ perl -naF, -le 'chomp; print $F[1] if $F[0]==500' STD
850

-n围绕您的while参数创建-e循环。

-a将每行拆分为@F-F可让您指定分隔符。由于您要分隔逗号上的字段,因此使用-F,

-l每次拨打print时都会添加换行符。

-e参数是要运行的程序(while中添加了-nchomp从输出中删除换行符。您在输出中得到换行符,因为您碰巧使用了该行中的最后一个字段。打印时-l会添加换行符;当你想要在行的中间提取一个字段时,这很重要。

答案 2 :(得分:0)

您获得2个换行符的原因:

  1. 反引号运算符不会从awk输出中删除尾随换行符。 $s包含"850\n"
  2. say函数在字符串后附加换行符。您的say "850\n"print "850\n\n"
  3. 相同