如果一列中的重复值比从其他列复制值到上面的一行

时间:2013-04-15 16:30:06

标签: perl

我正在使用一个看起来像这样的表

C1    C2    C3
1     a     b
2     c     d
4     e     g
4     f     h
5     x     y
...   ...   ...

如果C1中的值相同(在本例中有4倍),那么我希望将C2和C3的值粘贴在第一行,其中C1为4,我想删除第二行C1中的4行。所以最后看起来应该是这样的

C1    C2    C3
1     a     b
2     c     d
4     e,f   g,h
5     x     y

我正在使用perl脚本。我正在使用while循环遍历文件。我已经使用了像我看到的或者在其他脚本中看到的东西,但是我无法弄明白如何使用它们。它看起来很简单......

这就是我的while循环现在的样子

 while (<$DATA>) {
    @columns = split
    $var1 = $columns[0]
    $var2 = $columns[1]
    $var3 = $columns[2];         
     }  

1 个答案:

答案 0 :(得分:2)

使用哈希来控制重复项。我在我的示例中使用了散列(%info)散列,其中包含键C1和C2。每个都包含一个数组引用来添加重复的项目。

use strict;
use warnings;

my %info = ();
while (<DATA>) {
    my @columns = split /\s+/;
    if( exists $info{ $columns[0] } ) {
        push @{ $info{ $columns[0] }->{C2} }, $columns[1];
        push @{ $info{ $columns[0] }->{C3} }, $columns[2];
    }
    else {
        $info{ $columns[0] } = { C2 =>[ $columns[1] ], C3 => [ $columns[2]] }
    }        
}  

foreach my $c1(sort {$a<=>$b} keys %info ) {
    print $c1, "\t", 
          join(',',@{$info{$c1}->{C2}}), "\t", 
          join(',',@{$info{$c1}->{C3}}), "\n";
} 


__DATA__
1     a     b
2     c     d
4     e     g
4     f     h
5     x     y