0
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>;

在此先感谢您的帮助。

4

2 回答 2

1

如果您只想总结第二列,那么哈希是多余的。您可以这样做并直接在地图中计算总​​和。

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

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

my $sum = 0;

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

如果第 1 列可能没有文本(即,该行以一个空白开头,第一个非空白代表第二列),则将模式的第一部分从 更改^\S+^\S*

于 2013-08-03T06:49:38.163 回答
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
于 2013-08-03T08:01:47.087 回答