使用perl基于值的数据重组

时间:2013-05-30 20:49:14

标签: perl

我的数据看起来像这样,

1   20010101  945   A   6
1   20010101  946   B   4
1   20010101  947   P   3.5
1   20010101  950   A   5
1   20010101  951   P   4
1   20010101  952   P   4
1   20010101  1010  A   4
1   20010101  1011  P   4
2   20010101  940   A   3.5
2   20010101  1015  A   3
2   20010101  1113  B   3.5
2   20010101  1114  P   3.2
2   20010101  1115  B       3.4
2   20010101  1116  P   3.1
2   20010101  1119  P   3.6

我试图根据前两列的匹配(例如,1和20010101)找到所有行(带P),然后是最新的A和B值。

结果预计会像这样,

1   20010101  947   P  3.5  6   4
1   20010101  951   P  4    5   4
1   20010101  952   P  4    5   4
1   20010101  1011  P  4    4   4
2   20010101  1114  P  3.2  3   3.5
2   20010101  1116  P  3.1  3   3.4
2   20010101  1119  P  3.6  3   3.4

是否需要在Perl中使用哈希进行排序?我缺乏想法任何人都可以给出任何暗示吗?我将不胜感激!

2 个答案:

答案 0 :(得分:3)

perl -ane 'if($F[3] eq "P"){ s/$/  $la  $lb/; print; }else{ ($la,$lb) = ($F[3] eq "A")?($F[4],$lb):($la,$F[4]) }' data.txt

答案 1 :(得分:1)

使用简单的if-elsif结构解决最简单:

use strict;
use warnings;

my ($A, $B);
while (<DATA>) {
    my @data = split;
    if ($data[3] eq "A") {
        $A = $data[4];
    } elsif ($data[3] eq "B") {
        $B = $data[4];
    } elsif ($data[3] eq "P") {
        print join("\t", @data, $A, $B), "\n";
    }
}


__DATA__
1   20010101  945   A   6
1   20010101  946   B   4
1   20010101  947   P   3.5
1   20010101  950   A   5
1   20010101  951   P   4
1   20010101  952   P   4
1   20010101  1010  A   4
1   20010101  1011  P   4
2   20010101  940   A   3.5
2   20010101  1015  A   3
2   20010101  1113  B   3.5
2   20010101  1114  P   3.2
2   20010101  1115  B       3.4
2   20010101  1116  P   3.1
2   20010101  1119  P   3.6

<强>输出:

1       20010101        947     P       3.5     6       4
1       20010101        951     P       4       5       4
1       20010101        952     P       4       5       4
1       20010101        1011    P       4       4       4
2       20010101        1114    P       3.2     3       3.5
2       20010101        1116    P       3.1     3       3.4
2       20010101        1119    P       3.6     3       3.4

您可能希望在$A$B中补偿可能的空/未定义/旧值。