Chinaunix首页 | 论坛 | 博客
  • 博客访问: 266650
  • 博文数量: 54
  • 博客积分: 35
  • 博客等级: 民兵
  • 技术积分: 729
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-09 10:35
文章分类

全部博文(54)

文章存档

2014年(37)

2013年(17)

分类: LINUX

2014-01-04 18:47:46

原帖:处理前:
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的值。


点击(此处)折叠或打开

  1. #!/usr/bin/perl
  2. use 5.010;
  3. use warnings;
  4. use strict;

  5. my ( %A, %B );

  6. while (<DATA>) {
  7.         @_ = split;
  8.         push @{ $A{$_[0]} }, $_[2] if $_[1] eq "A";
  9.         push @{ $B{$_[0]} }, $_[2] if $_[1] eq "B";
  10.         say join "\t", @_, $A{$_[0]}[-1]//(), $B{$_[0]}[-1]//() if $_[1] eq "P";
  11. }

  12. __DATA__
  13. 1 A 6
  14. 1 B 4
  15. 1 P 3.5
  16. 1 A 5
  17. 1 P 4
  18. 1 P 4
  19. 1 A 4
  20. 1 P 4
  21. 2 P 3.5
  22. 2 A 3.5
  23. 2 A 3
  24. 2 B 3.5
  25. 2 P 3.2
  26. 2 B 3.4
  27. 2 P 3.1
  28. 2 P 3.6


  1. awk -vOFS='\t' '/P/{NF+=0;print $0,a[$1,"A"],a[$1,"B"];next}{a[$1,$2]=$3}'


阅读(1110) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~