我正在编写一个简单的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变量”,但变量也是用长字符串和新行保留的!
你能帮忙吗?谢谢。
答案 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
中添加了-n
。 chomp
从输出中删除换行符。您在输出中得到换行符,因为您碰巧使用了该行中的最后一个字段。打印时-l
会添加换行符;当你想要在行的中间提取一个字段时,这很重要。
答案 2 :(得分:0)
您获得2个换行符的原因:
$s
包含"850\n"
say
函数在字符串后附加换行符。您的say "850\n"
与print "850\n\n"