0

我的数据看起来像这样

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 中使用哈希进行排序?我缺乏想法有人可以给出任何提示吗?我将不胜感激!

4

2 回答 2

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
于 2013-05-30T21:05:40.787 回答
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

于 2013-05-30T21:45:15.933 回答