我的数据看起来像这样,
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中使用哈希进行排序?我缺乏想法任何人都可以给出任何暗示吗?我将不胜感激!
答案 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
中补偿可能的空/未定义/旧值。