免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1510 | 回复: 3
打印 上一主题 下一主题

大侠们,帮帮忙哈,这个怎么实现啊? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-27 20:24 |只看该作者 |倒序浏览
本帖最后由 perl初学者 于 2012-09-27 20:42 编辑

上午写的不是特别清晰,这会儿再简单描述一下,
我有一些数据,就像下面的数据一样:
ID start end
##
s  12 65
st  12 36
st1 12 16
st2 20 25
st3 30 36
##
sr 38 65
sr1 38 45
sr2 46 56
sr3 61 65
##
s 100 200
st 100 150
st1 100 120
st2 125  140
st3 145 150
而我想在ID为三个字母的行中间插入一行,使得这一行的数据start为上一行start+1,end为下一行数据的end-1(当然如果三个字母之间的数据是连续的则不加新的一行);即结果如下:
##
s  12 65
st  12 36
st1 12 16
ttt 17 19(ttt可随便命名)
st2 20 25
ttt 26 29
st3 30 36
##
sr 38 65
sr1 38 45
sr2 46 56
ttt  57 60
sr3 61 65
##
....

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
2 [报告]
发表于 2012-09-28 06:40 |只看该作者
就像下面的一样:
  1. #!/usr/bin/perl

  2. use 5.016;
  3. my $t = 'tmp';
  4. my @a = split /\n^##\n/m, do { local $/; <DATA> };

  5. say shift @a, "\n##";

  6. for (@a) {
  7.     my ( $a, $b ) = split /\n(?=^\w{3,})/m, $_, 2;
  8.     say $a;
  9.     my ( @b, @c ) = split /\n/, $b;

  10.     for ( 0 .. $#b ) {
  11.         my ( $x, $y, $z ) = @c ? @c : split( /\s+/, $b[$_] );
  12.         say $b[$_];

  13.         if ( $_ < $#b ) {
  14.             @c = split /\s+/, $b[ $_ + 1 ];
  15.             say join ' ', $t, $z + 1, $c[1] - 1 unless $z == $c[1] - 1;
  16.         }
  17.     }
  18.     say '##';
  19. }
  20. __DATA__
  21. ID start end
  22. ##
  23. s  12 65
  24. st  12 36
  25. st1 12 16
  26. st2 20 25
  27. st3 30 36
  28. ##
  29. sr 38 65
  30. sr1 38 45
  31. sr2 46 56
  32. sr3 61 65
  33. ##
  34. s 100 200
  35. st 100 150
  36. st1 100 120
  37. st2 125 140
  38. st3 145 150
复制代码
  1. ID start end
  2. ##
  3. s  12 65
  4. st  12 36
  5. st1 12 16
  6. tmp 17 19
  7. st2 20 25
  8. tmp 26 29
  9. st3 30 36
  10. ##
  11. sr 38 65
  12. sr1 38 45
  13. sr2 46 56
  14. tmp 57 60
  15. sr3 61 65
  16. ##
  17. s 100 200
  18. st 100 150
  19. st1 100 120
  20. tmp 121 124
  21. st2 125 140
  22. tmp 141 144
  23. st3 145 150
  24. ##
复制代码

论坛徽章:
0
3 [报告]
发表于 2012-09-28 10:20 |只看该作者
谢过了哈~总算知道自己哪个地方出错了!回复 2# rubyish


   

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
4 [报告]
发表于 2013-01-20 21:42 |只看该作者
过了一年时光:
  1. #!/usr/bin/perl
  2. $/ = '##';
  3. print scalar <DATA>, join "##", map {
  4.     my ( $m, $n ) = /(.*?)(^\w{3,}.*)/sm;
  5.     my @a = $n =~ /\w+/g;
  6.     for ( my $i = 0 ; $i < $#a - 2 ; $i += 3 ) {
  7.         my ( $x, $y ) = @a[ $i + 4, $i + 2 ];
  8.         $m .= "@a[$i..$i+2]\n" . ( $x-- - $y++ > 1 ? "tmp $y $x\n" : '' );
  9.     }
  10.     $m .= "@a[-3..-1]\n";
  11. } <DATA>;

  12. __DATA__
  13. ID start end
  14. ##
  15. s  12 65
  16. st  12 36
  17. st1 12 16
  18. st2 20 25
  19. st3 30 36
  20. ##
  21. sr 38 65
  22. sr1 38 45
  23. sr2 46 56
  24. sr3 61 65
  25. ##
  26. s 100 200
  27. st 100 150
  28. st1 100 120
  29. st2 125  140
  30. st3 145 150
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP