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>;
提前感谢您的帮助。
答案 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