我收到了一个文本文件,其中包含按行排序的大量数据。每列都是 以逗号分隔。
如何将列除以另一列以打印输出答案?我现在正在使用Perl,所以它必须在Perl中完成。我怎么能这样做?
这是我到目前为止所做的:
#!/usr/bin/perl
open (FILE, 'census2008.txt');
while (<FILE>) {
chomp;
($sumlev, $stname,$ctyname,$popestimate2008,$births2008,$deaths2008) = split(",");
}
close (FILE);
exit;
答案 0 :(得分:4)
有几种选择:
逐行读取文件,split
','
上的列并划分相关列(不要忘记处理被零除错误)
做同样的事情:
$ perl -F/,/ -lane 'print( $F[1] == 0 ? "" : $F[3]/$F[1] )' file.txt
使用即用型CPAN模块,例如Text::CSV
当然,TMTOWTDI™还有更多非正统/疯狂/无法形容的替代品,所以可以:
使用正则表达式解析相关列并划分匹配项:
if (/^\d*,(\d+),\d*,(\d+)/) { say $2/$1 if $2 != 0; }
使用s///e
执行此操作:
$ perl -ple 's!^\d*,(\d+),\d*,(\d+).*$! $2 == 0 ? "" : $2/$1 !e' file.txt;
让shell通过反引号进行肮脏的工作:
sub print_divide { say `cat file.txt | some_command_line_command` }
答案 1 :(得分:1)
#!/usr/bin/env perl
# divides column 1 by column 2 of some ','-delimited file,
# read from standard input.
# usage:
# $ cat data.txt | 8458760.pl
while (<STDIN>) {
@values = split(/,/, $_);
print $values[0] / $values[1] . "\n";
}
答案 2 :(得分:0)
如果您有固定宽度的数据列,您可以使用“解压缩”行:
#!/usr/bin/env perl
use strict;
use warnings;
while (<DATA>) {
chomp;
my ($sumlev,$stname,$ctyname,$popest,$births,$deaths)
= unpack("A2xA10xA15xA7xA5xA5");
printf "%-15s %4.2f\n", $ctyname, $births/$deaths;
}
__DATA__
10,Main ,My City , 10000, 200, 150
12,Poplar ,Somewhere , 3000, 90, 100
13,Maple ,Your Place , 9123, 100, 90