1 A 6
1 B 4
1 P 3.5
1 A 5
1 P 4
1 P 4
1 A 4
1 P 4
2 P 3.5
2 A 3.5
2 A 3
2 B 3.5
2 P 3.2
2 B 3.4
2 P 3.1
2 P 3.6
处理后:
1 P 3.5 6 4
1 P 4 5 4
1 P 4 5 4
1 P 4 4 4
2 P 3.5
2 P 3.2 3 3.5
2 P 3.1 3 3.4
2 P 3.6 3 3.4
处理要求:
输出第二列为P的行和离该行最近的A和B的值。
点击(此处)折叠或打开
-
#!/usr/bin/perl
-
use 5.010;
-
use warnings;
-
use strict;
-
-
my ( %A, %B );
-
-
while (<DATA>) {
-
@_ = split;
-
push @{ $A{$_[0]} }, $_[2] if $_[1] eq "A";
-
push @{ $B{$_[0]} }, $_[2] if $_[1] eq "B";
-
say join "\t", @_, $A{$_[0]}[-1]//(), $B{$_[0]}[-1]//() if $_[1] eq "P";
-
}
-
-
__DATA__
-
1 A 6
-
1 B 4
-
1 P 3.5
-
1 A 5
-
1 P 4
-
1 P 4
-
1 A 4
-
1 P 4
-
2 P 3.5
-
2 A 3.5
-
2 A 3
-
2 B 3.5
-
2 P 3.2
-
2 B 3.4
-
2 P 3.1
- 2 P 3.6
- awk -vOFS='\t' '/P/{NF+=0;print $0,a[$1,"A"],a[$1,"B"];next}{a[$1,$2]=$3}'