【问题标题】:How to Sort all lines between two patterns in a file in perl如何在perl中对文件中两个模式之间的所有行进行排序
【发布时间】:2020-08-03 17:04:39
【问题描述】:

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

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

输入文件如下所示:

BEGIN
This is line10
This is line3
This is line15
...
END
BEGIN
This is line50
This is line12
This is line400
...
END

注意: 模式BEGINEND 之间的所有行都需要排序。非常感谢 Perl 脚本的任何指针。

【问题讨论】:

  • 您能告诉我们您尝试解析BEGINEND 之间的数据吗?
  • 您需要帮助哪一部分?获取分隔符之间的部分?为此,您可以使用 .. 触发器运算符。使用自定义排序功能进行排序?您只需将回调传递给内置排序。我可以帮忙,我只需要知道什么
  • 谢谢。我可以得到如下分隔符之间的部分。 if (/BEGIN/ ... /END/){ print "$_ \n"; }
  • 排序需要限制在特定的部分。
  • 排序需要在该部分的第 5 列进行,例如下面 sort { $a->[5] cmp $b->[5] } @lines;

标签: perl


【解决方案1】:
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
  • -n逐行读取输入,运行每一行的代码
  • 如果我们在模式之间的块内,变量 $inside 为真
  • 对于块内的行,我们不打印它们,而是存储在一个数组中,参见push
  • 在块的最后一行,我们从数组中删除存储的行,按它们包含的数字(或您需要的任何其他内容)对它们进行排序并打印。请参阅splicesort。然后我们打印 END 模式线。
  • 在模式块之外,我们只打印线条。如果我们在那里遇到 BEGIN 模式,我们将标志 $inside 设置为 1 以开始处理该块。

【讨论】:

  • 您可能想使用-l。否则,foo␉bar 将排在foo 之前(其中“␉”是一个选项卡)。
  • Sort::Key::Natural 的natsort 是对任意行进行排序的不错选择。
  • @ikegami:通过移除触发器进行简化。排序只是一个示例,因为 OP 没有指定如何对行进行精确排序。
  • 是的,只是给 OP 或其他人的提示。
【解决方案2】:

以下 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/;
}

这在整行上按词汇排序。 请明确排序标准或根据您的需要进行修改。

【讨论】:

  • 我想知道如果 BEGIN 和 END 模式相同,如何 grep 所有行,例如。开始 这是第 10 行。这是第 3 行。这是第 15 行。 ...结束。
  • @user419534 要使此代码在您的开始模式和结束模式相同时工作,请在/BEGIN//END/ 之间使用三个点而不是两个点。并将if 条件内的/END/ 替换为/END/ &amp;&amp; @line。 (我已经用这些更改更新了答案。另外,这里的“grep”不清楚你的意思。)
猜你喜欢
  • 2020-03-10
  • 2023-04-04
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
  • 2018-02-11
  • 2016-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多