如何使用Perl将数据文件的列A除以列B.

时间:2011-12-10 18:15:50

标签: linux perl command

我收到了一个文本文件,其中包含按行排序的大量数据。每列都是 以逗号分隔。

如何将列除以另一列以打印输出答案?我现在正在使用Perl,所以它必须在Perl中完成。我怎么能这样做?

这是我到目前为止所做的:

 #!/usr/bin/perl

 open (FILE, 'census2008.txt');
 while (<FILE>) {
     chomp;
     ($sumlev, $stname,$ctyname,$popestimate2008,$births2008,$deaths2008) = split(",");
 }
 close (FILE);
 exit;

3 个答案:

答案 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