perl添加文件列的内容

时间:2013-08-03 06:37:15

标签: perl add

Column A            | Column B    | Column C       |  Column D
35627799100             8               8               2 
35627788000             60              34              45 
35627799200             10              21              21 
35627780000             60              5               8

基本上我有一个如上所示的文件,并希望添加B列的内容,即8 + 60 + 10 + 60。坦率地说,我不确定是否需要删除第一行是文本,如果我可以使用split函数并将其放入散列中的某些内容:

my %hash = map {split/\s+/,$_,4} <$file>;

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

如果你只是想总结第二列,那么哈希是过度的。你可以这样做,直接在地图上计算总和。

my $sum;
$sum += (split /\s+/, $_)[1] while <$file>;

编辑:如果您在第2列中有标题行或其他具有非数字值的行,则如下面的注释所示,您将遇到问题。您可以通过将split换成正则表达式来避免这种情况,例如:

my $sum = 0;

while (<STDIN>)
{
    $sum += $1 if $_ =~ /^\S+\s+(\d+)/;
}

如果列1可能没有文本(即行以单个空格开头而第一个非空白表示第二列),则将模式的第一部分从^\S+更改为{ {1}}。

答案 1 :(得分:0)

这是一个基于您的数据的示例:

use strict;
use warnings;

my $sum_column_b = 0;
<DATA>; #drop header

while( my $line = <DATA>) {
    $line =~ m/\s+(\d+)/; #regexpr to catch second column values
    $sum_column_b += $1;
}
print $sum_column_b, "\n";  #<-- prints: 138


__DATA__
Column A            | Column B    | Column C       |  Column D
35627799100             8               8               2 
35627788000             60              34              45 
35627799200             10              21              21 
35627780000             60              5               8