每组总和不同的值

use*_*607 0 perl

我有一个制表符分隔的文件(带有标题行),其中我想根据另一列的数据的存在来计算一些值的总和.

这是我的表格的样子:

 C1 C2  C3  C4
 a  x   e   1
 b  x       3
 c  y       1
 d  z   f   4   
Run Code Online (Sandbox Code Playgroud)

对于C2中的所有相同值,我想在C3中得到相应值的总和.所以新表应该如下所示:

 C1    C2    C3    C4    C5
 a     x     e     1     4
 b     x           3     4
 c     y           1     1
 d     z     f     4     4
Run Code Online (Sandbox Code Playgroud)

所以我想保留我的表的原始结构(列C1,C2,C3,C4和相同的行数),但最后我想添加另一列,在这种情况下,对于行a和b,来自C4总结并放入C5,因为C2的值是相同的.线c和d的C5值与C4相同,因为C2中的y和z是唯一的.

任何人都可以帮我在Perl中如何做到这一点?我想我应该遍历文件并创建一个变量$ sum,通过遍历每一行,他将C4的数量相加,然后放入C5.

Lee*_*hem 5

逐行读取数据文件,将每一行推送到一个数组,并使用第2列作为键将第4列的值记录在哈希中.完成后,迭代该数组,逐个打印其元素和相应的第4列.

#!/usr/bin/perl

use strict;
use warnings;

my $header = <DATA>;
chomp $header;
$header = join "\t", (split /\t/, $header), 'C5';

my (%record, @lines);

while (<DATA>) {
    chomp;
    my @cols = split /\t/;
    $record{$cols[1]} += $cols[3];
    push @lines, \@cols;
}

print "$header\n";
foreach (@lines) {
    print (join "\t", (@$_, $record{$_->[1]}), "\n");
}

__DATA__
 C1 C2  C3  C4
 a  x   e   1    
 b  x       3    
 c  y       1    
 d  z   f   4 
Run Code Online (Sandbox Code Playgroud)