【问题标题】:Perl regex: More than one line to match and outputPerl 正则表达式:匹配和输出多行
【发布时间】:2016-02-23 10:52:17
【问题描述】:

我的大多数 Perl 正则表达式成功都是偶然的,但目前无法获得。我需要另一个意外。
我想我快要解决这个问题了,我的努力如下:

while ( my $line = <INPUT> ) {

                if($line =~ /\s{6,11}(\w{1}\d{1}\w{0,5})\s{0,5}(\d{3})/) {
                my @c_no = "$1,$2\n";   
                foreach (@c_no) {
                print OUTPUT $_;                    
                }
                if ($line =~ /^(\s{1}THN)(\s{1,3}\d{0,2}.\d)(\s{1,3}\d{0,2}.\d)(\s{1,2}\d{0,1}.\d{4})(\s{1,2}\d{2,4})
                            (\s{2,3}\d{1,2})(\s{1,6}\d{1,4})(\s{1,2}\d{1,2})(\s{1,5}\d{1,4})(\s{1,4}\d{1,4})
                            (\s{1,4}\d{1,4})(\s{1,4}\d{1,4})(\s{1,4}\d{1,4})(\s{1,4}\d{1,4})|(^1(P1))/x){

                print OUTPUT "$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14\n";
                }           
                }
                }

我正在尝试读取文件,打印第一个匹配项(第一个'if..')以输出,查找第二个匹配项(第二个'if..'),输出它或它们,然后进一步查找第一场比赛,依此类推。
上面的代码只打印第一个匹配项。
我可以让它在更改代码后打印第二个,但不能同时打印。
我想我快到了,它可能只需要改变大括号的位置。

输入文件看起来 +- 如下:

1(P1)      3 P.ell    05/0120 W/P068819 0 12.0 98/99  380 380           C03     103          PROCESSED 18/02/16 TIME 19.07.50 KSINA=8

AGE  DBH   HT  VTREE  SPH  BA  TOTAL WS  UTIL    S    A    B    C    D   TCAI   CTCAI  TMAI   UCAI CUCAI  UMAI   SCAI CSCAI  SMAI IAGE

  1   .0   .2  .0000  979   0      0  0     0    0    0    0    0    0     .0     0    .0     .0     0    .0     .0     0    .0  1.0
  2   .0   .9  .0000  979   0      0  0     0    0    0    0    0    0     .0     0    .0     .0     0    .0     .0     0    .0  2.0
  3  3.9  2.0  .0007  979   1      1  1     0    0    0    0    0    0     .7     1    .2     .0     0    .0     .0     0    .0  3.0
  4  7.1  3.4  .0041  979   4      4  3     1    1    0    0    0    0    3.4     4   1.0     .6     1    .2     .0     0    .0  4.0
  5  9.4  4.6  .0102  979   7     10  5     5    5    0    0    0    0    5.9    10   2.0    4.1     5    .9     .0     0    .0  5.0
  6 11.3  5.7  .0188  979  10     18  6    12   12    1    0    0    0    8.4    18   3.1    7.5    12   2.0     .0     0    .0  6.0
  7 13.0  6.7  .0293  979  13     29  7    22   19    3    0    0    0   10.3    29   4.1    9.7    22   3.1     .0     0    .0  7.0
                   17%                                                                                                           
THN 11.4  6.7  .0230  164   2      4  1     3    2    0    0    0    0                                                              
REM 13.4  6.7  .0315  815  12     26  6    20   17    3    0    0    0                                                              

  8 15.0  7.6  .0453  815  14     37  6    31   21   10    0    0    0   11.2    40   5.0   10.9    33   4.1     .0     0    .0  7.6
  9 16.4  8.5  .0607  815  17     49  6    43   23   20    0    0    0   12.5    52   5.8   12.2    45   5.0     .2     0    .0  8.6
 10 17.4  9.4  .0771  815  19     63  7    56   24   30    2    0    0   13.4    66   6.6   13.1    58   5.8    1.3     2    .2  9.6
 11 18.3 10.3  .0941  815  21     77  7    70   24   41    5    0    0   13.9    80   7.3   13.6    72   6.5    3.0     5    .4 10.6
 12 19.0 11.3  .1118  815  23     91  7    84   24   50   10    0    0   14.4    94   7.8   14.1    86   7.2    5.4    10    .8 11.6
 13 19.6 12.2  .1299  815  25    106  8    98   24   56   18    0    0   14.7   109   8.4   14.4   100   7.7    8.0    18   1.4 12.6
                   33%                                                                                                           
THN 17.5 12.2  .1044  265   6     28  2    25    8   15    3    0    0                                                              
REM 20.6 12.2  .1421  550  18     78  5    73   16   42   15    0    0                                                              

 14 21.3 13.0  .1636  550  20     90  6    84   16   44   25    0    0   11.8   121   8.6   11.6   112   8.0   10.0    28   2.0 10.4
 15 22.0 13.7  .1864  550  21    103  6    97   16   45   36    0    0   12.5   133   8.9   12.3   124   8.3   11.0    39   2.6 11.2
 16 22.7 14.5  .2100  550  22    116  6   109   15   46   48    0    0   13.0   146   9.1   12.7   137   8.6   12.0    51   3.2 12.0
 17 23.3 15.3  .2345  550  23    129  6   123   15   46   61    0    0   13.5   160   9.4   13.2   150   8.8   12.9    64   3.8 12.8
 18 23.9 15.9  .2598  550  25    143  7   136   15   46   74    1    0   13.9   174   9.6   13.6   164   9.1   13.8    78   4.3 13.6
                   40%                                                                                                           
THN 21.6 15.9  .2142  220   8     47  2    45    6   19   20    0    0                                                              
REM 25.3 15.9  .2901  330  17     96  4    92    9   28   54    1    0                                                              

 19 26.0 16.6  .3203  330  17    106  4   101    9   27   63    3    0   10.0   184   9.7    9.8   174   9.1   10.5    88   4.6 11.0
 20 26.6 17.3  .3519  330  18    116  5   112    9   27   71    5    0   10.4   194   9.7   10.2   184   9.2   10.6    99   4.9 11.7
 21 27.2 18.0  .3849  330  19    127  5   122    9   27   80    8    0   10.9   205   9.8   10.7   194   9.3   11.1   110   5.2 12.4

预期结果:

 C03     103                                                         
 THN  7 11.4  6.7  .0230  164   2      4  1     3    2    0    0    0    0                                                              
 THN 13 17.5 12.2  .1044  265   6     28  2    25    8   15    3    0    0                                                              
 THN 18 21.6 15.9  .2142  220   8     47  2    45    6   19   20    0    0
 C04 103
 THN etc.
.
.
.
.

或者只是:

1(P1)      3 P.ell    05/0120 W/P068819 0 12.0 98/99  380 380           C03     103          PROCESSED 21/02/16 TIME 22.16.52 KSINA=8  
THN  7 11.4  6.7  .0230  164   2      4  1     3    2    0    0    0    0                                                              
THN 13 17.5 12.2  .1044  265   6     28  2    25    8   15    3    0    0                                                              
THN 18 21.6 15.9  .2142  220   8     47  2    45    6   19   20    0    0
C04 103
THN etc.
.
.
.
.

我添加了第二个预期结果选项,因为我的问题不够清楚。

“C03 103”行是我给出的示例输入文本(上图)。

这两个变量将变为'C04 103'或'A03a 104'或'D051a 101'等。

如果结果可以只提供包含这些变量的行 1(P1) .....这就足够了。

数据以重复批次的形式出现,起始行 1(P1).....

见上面的例子。

非常感谢您的帮助。我快到了。

我的最终编辑,如果有帮助的话:

完整的正常输入批次如下。为了节省空间,我剪掉了一些。

可能不是一个好主意:

1(P1)      3 P.ell    05/0120 W/P068819 0 12.0 98/99  380 380           C03     104          PROCESSED 21/02/16 TIME 22.16.52 KSINA=8

AGE   SPH   %THN  %INC     SV SI   MAI20  HTPC  VIPC   AGE BA  DBH   HT  SPH   CIH% CIV%    CVD BCON    CMAI      C0   C0CAL    SI20
0  1100     .0  89.0%SPH  2  2     .00    .0    .0 20.00  1   .0 17.3    0     .0   .0     .0   .0    .0000    .000    0%      .00
7   815   25.9    .0      2  2    9.90  75.5  47.2 20.00  1 26.6 17.3  330     .0   .0     .0 13.0    .2099   1.005   .000   17.30
13   550   32.5    .0                                                                                                              
18   330   40.0    .0                                                                                                              
45     0  100.0    .0                                                                                                              
0SQ     -4  -4  -4  = SI20  17 17 17              PLANTN---104 GREEN MEADOWS       MODEL---P.ELLIOTTII MAC MAC   SQ    10 SI20  22.90
HTPC   76  76  76  =MAI20  10 10 10 FROM HTPC                                                                   HTPC 100 MAI20 20.71
VIPC   47  47  47  =MAI20  10 10 10              HTPC/VIPC REGRESSION---P.ELLIOTTII GENERAL 1/83                VIPC 100 MAI20 20.99
                 MAIDBH     0                                                                                                    
                 INMAI==>   0                                                                                                    
0INPUT FOR CALCULATING HTPC & VIPC =  HT  ---- ----                                                                                  

AGE  DBH   HT  VTREE  SPH  BA  TOTAL WS  UTIL    S    A    B    C    D   TCAI CTCAI  TMAI   UCAI CUCAI  UMAI   SCAI CSCAI  SMAI IAGE

1   .0   .2  .0000  979   0      0  0     0    0    0    0    0    0     .0     0    .0     .0     0    .0     .0     0    .0  1.0
2   .0   .9  .0000  979   0      0  0     0    0    0    0    0    0     .0     0    .0     .0     0    .0     .0     0    .0  2.0
3  3.9  2.0  .0007  979   1      1  1     0    0    0    0    0    0     .7     1    .2     .0     0    .0     .0     0    .0  3.0
4  7.1  3.4  .0041  979   4      4  3     1    1    0    0    0    0    3.4     4   1.0     .6     1    .2     .0     0    .0  4.0
5  9.4  4.6  .0102  979   7     10  5     5    5    0    0    0    0    5.9    10   2.0    4.1     5    .9     .0     0    .0  5.0
6 11.3  5.7  .0188  979  10     18  6    12   12    1    0    0    0    8.4    18   3.1    7.5    12   2.0     .0     0    .0  6.0
7 13.0  6.7  .0293  979  13     29  7    22   19    3    0    0    0   10.3    29   4.1    9.7    22   3.1     .0     0    .0  7.0
                   17%                                                                                                           
THN 11.4  6.7  .0230  164   2      4  1     3    2    0    0    0    0                                                              
REM 13.4  6.7  .0315  815  12     26  6    20   17    3    0    0    0                                                              

 8 15.0  7.6  .0453  815  14     37  6    31   21   10    0    0    0   11.2    40   5.0   10.9    33   4.1     .0     0    .0  7.6
 9 16.4  8.5  .0607  815  17     49  6    43   23   20    0    0    0   12.5    52   5.8   12.2    45   5.0     .2     0    .0  8.6
10 17.4  9.4  .0771  815  19     63  7    56   24   30    2    0    0   13.4    66   6.6   13.1    58   5.8    1.3     2    .2  9.6
11 18.3 10.3  .0941  815  21     77  7    70   24   41    5    0    0   13.9    80   7.3   13.6    72   6.5    3.0     5    .4 10.6
12 19.0 11.3  .1118  815  23     91  7    84   24   50   10    0    0   14.4    94   7.8   14.1    86   7.2    5.4    10    .8 11.6
13 19.6 12.2  .1299  815  25    106  8    98   24   56   18    0    0   14.7   109   8.4   14.4   100   7.7    8.0    18   1.4 12.6
                   33%                                                                                                           
THN 17.5 12.2  .1044  265   6     28  2    25    8   15    3    0    0                                                              
REM 20.6 12.2  .1421  550  18     78  5    73   16   42   15    0    0                                                              

14 21.3 13.0  .1636  550  20     90  6    84   16   44   25    0    0   11.8   121   8.6   11.6   112   8.0   10.0    28   2.0 10.4
15 22.0 13.7  .1864  550  21    103  6    97   16   45   36    0    0   12.5   133   8.9   12.3   124   8.3   11.0    39   2.6 11.2
16 22.7 14.5  .2100  550  22    116  6   109   15   46   48    0    0   13.0   146   9.1   12.7   137   8.6   12.0    51   3.2 12.0
17 23.3 15.3  .2345  550  23    129  6   123   15   46   61    0    0   13.5   160   9.4   13.2   150   8.8   12.9    64   3.8 12.8
18 23.9 15.9  .2598  550  25    143  7   136   15   46   74    1    0   13.9   174   9.6   13.6   164   9.1   13.8    78   4.3 13.6
                   40%                                                                                                           
THN 21.6 15.9  .2142  220   8     47  2    45    6   19   20    0    0                                                              
REM 25.3 15.9  .2901  330  17     96  4    92    9   28   54    1    0                                                              

19 26.0 16.6  .3203  330  17    106  4   101    9   27   63    3    0   10.0   184   9.7    9.8   174   9.1   10.5    88   4.6 11.0
20 26.6 17.3  .3519  330  18    116  5   112    9   27   71    5    0   10.4   194   9.7   10.2   184   9.2   10.6    99   4.9 11.7
21 27.2 18.0  .3849  330  19    127  5   122    9   27   80    8    0   10.9   205   9.8   10.7   194   9.3   11.1   110   5.2 12.4
22 27.9 18.7  .4192  330  20    138  5   133    8   26   87   11    0   11.3   216   9.8   11.1   206   9.3   11.5   121   5.5 13.2
23 28.4 19.3  .4546  330  21    150  5   145    8   26   94   16    0   11.7   228   9.9   11.4   217   9.4   11.8   133   5.8 14.0
24 29.0 20.0  .4914  330  22    162  5   157    8   26  101   22    0   12.2   240  10.0   11.9   229   9.5   12.3   145   6.1 14.9
25 29.6 20.6  .5292  330  23    175  6   169    8   25  106   29    0   12.5   253  10.1   12.2   241   9.6   12.6   158   6.3 15.7
26 30.2 21.2  .5682  330  24    188  6   182    8   25  112   37    0   12.9   265  10.2   12.6   254   9.8   13.0   171   6.6 16.5
27 30.7 21.8  .6083  330  25    201  6   194    8   25  115   46    0   13.2   279  10.3   13.0   267   9.9   13.3   184   6.8 17.3
28 31.3 22.4  .6492  330  25    214  7   208    8   24  119   56    1   13.5   292  10.4   13.2   280  10.0   13.6   198   7.1 18.2
29 31.9 23.0  .6908  330  26    228  7   221    8   24  122   65    2   13.7   306  10.5   13.5   293  10.1   13.8   212   7.3 19.0
30 32.4 23.5  .7332  330  27    242  7   235    8   24  123   77    3   14.0   320  10.7   13.7   307  10.2   14.0   226   7.5 19.8
31 33.0 23.9  .7766  330  28    256  7   249    8   24  125   88    5   14.3   334  10.8   14.0   321  10.4   14.3   240   7.7 20.4
32 33.6 24.4  .8202  330  29    271  8   263    8   23  126   99    7   14.4   349  10.9   14.1   335  10.5   14.4   255   8.0 21.0

Final,Final Edit:我忘了说明我需要读出“THN”行之前记录的最后一个年龄。这个年龄读数是指它正下方的“THN”线。我已经修改了预期的输出以在“THN”条目之后包含年龄读数。

直到现在我才意识到这一点,因此它没有出现在我尝试的代码中。

【问题讨论】:

  • 您的要求不清楚,请提供您输入文件的摘录和预期结果。

标签: regex perl


【解决方案1】:

老实说 - 对于您正在尝试做的事情,答案可能是不是一个复杂的正则表达式。

我的意思是,根据您指定的内容,这会做到:

#!/usr/bin/env perl

use strict;
use warnings;

while ( <> ) {
    if ( m/PROCESSED/ ) { 
        print join " ",m/(\w+)\s+(\w+)\s+PROCESSED/,"\n";
    }
    print if /^THN/;
}

如果您的事情比这更复杂,我建议您不要对每一行进行正则表达式,而是:

#!/usr/bin/env perl

use strict;
use warnings;

my @header;
while (<>) {
   if ( m/PROCESSED/ ) { 
        print join " ",m/(\w+)\s+(\w+)\s+PROCESSED/,"\n";
    }
    if (m/AGE/) {
      chomp( @header = split );
   }
   my %this_row;
   @this_row{@header} = split;
   if ( $this_row{AGE} and $this_row{AGE} eq "THN" ) { 
        print join ("\t", @this_row{@header[0..13]}),"\n";
   }
}

这利用哈希切片,根据标题行将每一行存储为哈希。这很有用,因为这意味着您可以通过标题来引用元素。例如。

$this_row{AGE};

如果您只是想边走边打印,那么第一个答案就可以了。

基于 cmets:

  • Data::Dumper 是一种打印数据结构(如哈希)的方式。仅删除它是行不通的,因为您需要“处理”打印哈希。
  • 你有一行包含THN。但是如果你改用/^THN/,你仍然可以使用第一个sn-p。

【讨论】:

  • 感谢您的 cmets 和代码 @Sobrique。请参阅我对上述问题的添加编辑。我不够清楚。在示例的情况下,需要 C03 103。这些变量会发生变化。但是,正如我在编辑中所说,仅提供它们包含的行就足够了。在这两种情况下,您的代码都会在正确的位置找到所有正确的 'THN...' 行。但是,在这两种情况下,代码都会输出以“AGE...”开头的行,这不是必需的。我试图调整它以获取 '1(P1)...' 行但没有成功。感谢您富有洞察力的意见。
  • 另外,@Sobrique 'THN' 行在行首输出'HASH(0x6b0f70)'。
  • @Sobriquet。在我的代码中正确应用您的代码(第二个示例)并在您的代码中替换我的第一个搜索要求后,我检查了输出。它现在可以正确输出这两个变量。由于某种原因,我无法从输出中删除“AGE...”行。 'THN...' 行现在以 'HASH(0xd6fdc8) ' 开头
  • 'HASH(0x6abd28)' 似乎也位于这两个变量的前面。
  • 好的@Sobrique。我把你的“Dumper”留在了代码中,(我用 OUTPUT 替换了它)并且所有的“HASH........”都消失了。对不起。你能帮我摆脱“年龄...”这一行吗?
【解决方案2】:

要确切地知道你要做什么并不容易,但也许你需要一个内部循环。

类似的东西

while ( my $line = <INPUT> ) {

    if($line =~ /\s{6,11}(\w{1}\d{1}\w{0,5})\s{0,5}(\d{3})/) {
        my @c_no = "$1,$2\n";
        foreach (@c_no) {
            print OUTPUT $_;
        }
        while ( my $line = <INPUT> ) {
            if ($line =~ /^(\s{1}THN)(\s{1,3}\d{0,2}.\d)(\s{1,3}\d{0,2}.\d)(\s{1,2}\d{0,1}.\d{4})(\s{1,2}\d{2,4})
                (\s{2,3}\d{1,2})(\s{1,6}\d{1,4})(\s{1,2}\d{1,2})(\s{1,5}\d{1,4})(\s{1,4}\d{1,4})
                (\s{1,4}\d{1,4})(\s{1,4}\d{1,4})(\s{1,4}\d{1,4})(\s{1,4}\d{1,4})|(^1(P1))/x){

                print OUTPUT "$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14\n";
                last;
            }
        }
    }
}

【讨论】:

  • 谢谢克里斯。答案一定是循环的,但我不知道到底是怎么回事。您的代码只为第一个“if”提供一个条目,并继续为第二个“if”提供所有结果。
  • 抱歉 - 我忘记了 last 命令,当找到匹配项时,它会跳出内部循环。我已经编辑了答案
  • 再次感谢@chris-lear。我快到了。您的代码在正确的位置提供了第一次搜索(A01 111)等的所有正确结果,但第二次搜索(THN ....)中每批只有一个结果。例如,在上面的示例中,有三行以“THN”开头,所有三行都必须在第一次搜索重新开始之前出现。非常感谢您所做的贡献。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-02
  • 2012-04-13
相关资源
最近更新 更多