+ -
当前位置:首页 → 问答吧 → 利用perl 如何抽取 input.txt 部分内容,排列成output.txt中这样形式

利用perl 如何抽取 input.txt 部分内容,排列成output.txt中这样形式

时间:2011-07-23

来源:互联网

本帖最后由 weichanghe2000 于 2011-07-23 01:10 编辑

input.txt 内容如下:
  1. ID=1 IX=-1 IY=-1
  2. Kuan=1 Chang=0.1 Tem=20
  3. Begin to generate date:

  4. Vb=0
  5. X=x11, x12
  6. Y=y11, y12
  7. Z=z11, z12

  8. Vb=0.4
  9. X=x21, x22
  10. Y=y21, y22
  11. Z=z21, z22

  12. Vb=1
  13. X=x31, x32
  14. Y=y31, y32
  15. Z=z31, z32
  16. K=k31, k32
  17. ******************

  18. ID=1 IX=2 IY=3
  19. Kuan=2 Chang=0.5 Tem=20
  20. Begin to generate date:

  21. Vb=0
  22. X=x41, x42
  23. Y=y41, y42
  24. Z=z41, z42

  25. Vb=0.4
  26. X=x51, x52
  27. Y=y51, y52
  28. Z=z51, z52

  29. Vb=1
  30. X=x61, x62
  31. Y=y61, y62
  32. Z=z61, z62
  33. K=k61, k62
  34. ******************
  35. 后面 还有很多段这样的
复制代码
output.txt 内容如下:
  1. ID  Kuan  Chang  Tem  IX   IY   Vb   X1    X2    Y1    Y2    Z1    Z2    K1     K2
  2. 1   1     0.1    20   -1   -1   0    x11   x12   y11   y12   z11   z12   null   null
  3. 1   1     0.1    20   -1   -1   0.4  x21   x22   y21   y22   z21   z22   null   null
  4. 1   1     0.1    20   -1   -1   1    x31   x32   y31   y32   z31   z32   k31    k32
  5. 1   2     0.5    20   2    3    0    x41   x42   y41   y42   z41   z42   null   null
  6. 1   2     0.5    20   2    3    0.4  x51   x52   y51   y52   z51   z52   null   null
  7. 1   2     0.5    20   2    3    1    x61   x62   y61   y62   z61   z62   k31    k32
  8. ……………
  9. ……………
  10. ……………
复制代码
我的问题是想请教大家:利用perl 如何抽取 input.txt 中部分内容,并输出到output.txt,排列成output.txt中这样形式。

作者: weichanghe2000   发布时间: 2011-07-23

本帖最后由 yinyuemi 于 2011-07-23 05:32 编辑

回复 weichanghe2000
  1. #!/bin/perl
  2. use strict;
  3. my @title=qw(ID Kuan Chang Tem IX IY Vb X1 X2 Y1 Y2 Z1 Z2 K1 K2);
  4. my %value;
  5. my ($line,$label,$tmp);

  6. while (<DATA>){
  7.         chomp;
  8.         my ($a,$b)=(1,2);
  9.         s/(\w+)=(\w+), (\w+)/$1$a=$2 $1$b=$3/;
  10.         if(/^ID/){$label=0;$tmp="";}
  11.         if(/Vb/){$label=1;$line++;}
  12.         if($label eq 0){
  13.                 while (m,(\w+)=([^\s]+)\s?,g){
  14.                         $value{$1}=$2;
  15.                 }
  16.         }elsif($label eq 1){
  17.                 for(0..5){$tmp.=$value{$title[$_]}."\t";}
  18.                 while (m,(\w+)=([^\s]+)\s?,g){
  19.                         $value{$1}{$line}=$tmp.$2;
  20.                         $label++;
  21.                 }
  22.         }else{
  23.                 while (m,(\w+)=([^\s]+)\s?,g){
  24.                         $value{$1}{$line}=$2;
  25.                         $tmp="";
  26.                 }
  27.         }       
  28. }

  29. print join "\t",@title,"\n";
  30. for my $m (1..$line){
  31.         for my $n (6..$#title){
  32.                 print  $value{$title[$n]}{$m}||"NULL","\t";
  33.         }
  34.         print "\n";
  35. }


  36. __DATA__
  37. ID=1 IX=-1 IY=-1
  38. Kuan=1 Chang=0.1 Tem=20
  39. Begin to generate date:

  40. Vb=0
  41. X=x11, x12
  42. Y=y11, y12
  43. Z=z11, z12

  44. Vb=0.4
  45. X=x21, x22
  46. Y=y21, y22
  47. Z=z21, z22

  48. Vb=1
  49. X=x31, x32
  50. Y=y31, y32
  51. Z=z31, z32
  52. K=k31, k32

  53. ****************
  54. ID=1 IX=2 IY=3
  55. Kuan=2 Chang=0.5 Tem=20
  56. Begin to generate date:

  57. Vb=0
  58. X=x41, x42
  59. Y=y41, y42
  60. Z=z41, z42

  61. Vb=0.4
  62. X=x51, x52
  63. Y=y51, y52
  64. Z=z51, z52

  65. Vb=1
  66. X=x61, x62
  67. Y=y61, y62
  68. Z=z61, z62
  69. K=k61, k62
复制代码

作者: yinyuemi   发布时间: 2011-07-23

太牛了 !楼上的 。

作者: qq64878641   发布时间: 2011-07-23