如何在perl中对文件中两个模式之间的所有行进行排序

如何在perl中对文件中两个模式之间的所有行进行排序,perl,Perl,我有一个文本文件,其中有需要在两种模式之间排序的行 我正在编写Perl脚本,但似乎并没有产生结果 输入文件如下所示: BEGIN This is line10 This is line3 This is line15 ... END BEGIN This is line50 This is line12 This is line400 ... END 注: 模式开始和结束之间的所有行都需要排序。非常感谢任何关于此的Perl脚本指针。Perl-ne'if($inside){ perl -ne '

我有一个文本文件,其中有需要在两种模式之间排序的行

我正在编写Perl脚本,但似乎并没有产生结果

输入文件如下所示:

BEGIN
This is line10
This is line3
This is line15
...
END
BEGIN
This is line50
This is line12
This is line400
...
END
注: 模式
开始
结束
之间的所有行都需要排序。非常感谢任何关于此的Perl脚本指针。

Perl-ne'if($inside){
perl -ne 'if ($inside) {
              if (/END/) {
                  print sort {
                      ($a =~ /(\d+)/)[0] <=> ($b =~ /(\d+)/)[0]
                  } splice @buffer;
                  print;
              } else { push @buffer, $_ }
          } else {
              print;
              $inside = 1 if /BEGIN/;
          }' -- input-file
如果(/END/){ 打印排序{ ($a=~/(\d+/)[0]($b=~/(\d+)/)[0] }拼接@缓冲区; 打印 }else{push@buffer,$\ }否则{ 打印 $inside=1 if/BEGIN/; }“--输入文件
  • -n
    逐行读取输入,为每行运行代码
  • 如果在模式之间的块中,变量
    $inside
    为真
  • 对于块内的行,我们不打印它们,而是存储在数组中,请参见
  • 在块的最后一行,我们从数组中删除存储的行,按它们包含的数字(或您需要的任何其他数字)对它们进行排序并打印。看见然后我们打印结束模式线
  • 在图案块之外,我们只需打印线条。如果我们在那里遇到BEGIN模式,我们将标志$inside设置为1以开始处理块

    • 以下perl脚本可以正常工作。将输入文件作为参数传递

      use strict;
      use warnings;
      
      my @line;
      
      while (<>) {
          push @line, $_ if (/BEGIN/.../END/);
          if(/END/ && @line) {
                  chomp @line;
                  print "$_$/" for sort @line[1..$#a-1];
                  @line = ();
          }
          print if /BEGIN|END/;
      }
      
      使用严格;
      使用警告;
      我的@line;
      而(){
      按@line,$\if(/BEGIN/../END/);
      如果(/END/&&@行){
      咬线;
      为第[1..$#a-1]行的排序打印“$\u$/”;
      @行=();
      }
      打印if/BEGIN | END/;
      }
      
      这会按整行进行词汇排序。
      请澄清排序标准或根据您的需要进行修改。

      您能告诉我们您在
      BEGIN
      END
      之间解析数据的方法吗?您需要哪部分的帮助?在delimeters之间获取零件?为此,您可以使用。。触发器运算符。用于使用自定义排序功能进行排序?您只需将回调传递给排序内置项。我可以帮你,我只需要知道你在说什么。我可以得到分隔符之间的部分,如下所示。如果(/BEGIN/../END/){print“$\n”;}排序需要限制在一个特定的部分。排序需要在该部分行的第5列进行,例如下面的排序{$a->[5]cmp$b->[5]}@lines;您可能想使用
      -l
      。否则,
      foo␉条形图
      将在
      foo
      之前排序(其中“␉" (这是一个标签).Sort::Key::Natural的
      natsort
      将是对任意行进行排序的好选择。@ikegami:通过删除触发器来简化排序。排序只是一个例子,因为OP没有指定如何准确地对行进行排序。是的,只需为OP或其他人提供提示。我想知道如果开始和结束模式都相同,如何对所有行进行grep例如。BEGIN这是第10行。这是第3行。这是第15行。……END。@user419534若要在开始模式和结束模式相同时使用此代码,请在
      /BEGIN/
      /E之间使用三个点而不是两个点ND/
      。并将
      /END/
      中的
      条件替换为
      /END/&&&&line
      (我已经用这些更改更新了答案。此外,这里不清楚“grep”是什么意思。)