gpt4 book ai didi

perl - sed、awk 或 perl : Pattern range match, 打印 45 行然后添加记录分隔符

转载 作者:行者123 更新时间:2023-12-04 05:53:02 26 4
gpt4 key购买 nike

我有一个包含由模式/#matchee/分隔的记录的文件。这些记录的长度各不相同……比如说 45 - 75 行。它们需要全部为 45 行,并且仍然保持记录分隔符。记录可以来自不同的部门,部门名称在空行后的第 2 行。所以记录分隔符可以简单地认为是/^#matchee/或/^matchee/后跟\n。有这个问题的豪华版和沃尔玛版......

豪华版

按模式范围提取每条记录,以便我可以按部门对记录进行排序。例如,使用 sed

sed -n '/^DEPARTMENT NAME/,/^#matchee/{p;}' mess-o-records.txt

然后,仅打印文件中每条记录的前 45 行以符合
45 行约束。

最后,确保结果仍然有第 45 行的记录分隔符。

沃尔玛版

与上面相同,但不使用范围,只需使用记录分隔符。

状态

我在这方面的尝试可能会澄清我正在尝试做的事情。
sed -n -e '/^DEPARTMENT-A/,/^#matchee/{p;}' -e '45q' -e '$s/.*/#matchee/' mess-o-records.txt

这当然行不通,因为 sed 在每个命令中都在对整个文件进行操作。
我需要它对每个范围匹配而不是整个文件进行操作。

样本输入 - 80 行 (因空格而截断)
<blank line>
DEPARTMENT-A
Office space 206
Anonymous, MI 99999

Harold O Nonymous
Buckminster Abbey
Anonymous, MI 99999

item A Socket B 45454545
item B Gizmo Z 76767676
<too many lines here>
<way too many lines here>


#matchee

样本输出 - 现在只有 45 行
<blank line>
DEPARTMENT-A
Office space 206
Anonymous, MI 99999

Harold O Nonymous
Buckminster Abbey
Anonymous, MI 99999

item A Socket B 45454545
item B Gizmo Z 76767676
<Record now equals exactly 45 lines>
<yet record delimiter is maintained>

#matchee

澄清更新

如果这让事情变得更容易,我将永远不需要超过前 40 行。也许过程是:
  • 匹配模式
  • 打印前 40 行。
  • 垫到合适的长度。例如,45 行。
  • 重新启用分隔符。例如,#matchee

  • 我认为这会更灵活——即,可以处理短于 45 行的记录。

    下面是基于@Borodin 的 Perl 示例的即兴演奏:
    my $count = 0;
    $/ = "#matchee";

    while (<>) {
    if (/^REDUNDANCY.*DEPT/) {
    print;
    $count = 0;
    }
    else {
    print if $count++ < 40;
    print "\r\n" x 5;
    print "#matchee\r\n";
    }
    }

    这会为每条记录添加 5 个换行符 + 分隔模式/#matchee/。所以这是错误的——但它说明了我想要的。

    打印 40 行基于部门 - 垫 - 大头针分隔符。

    最佳答案

    我想我明白你想要什么。不确定关于按模式范围拉每个记录的位。是 #matchee总是跟着一个空行,然后是部门行?所以实际上记录数为 2?

    这个 Perl 片段做了我理解你需要的。

    如果您愿意,可以将输入文件放在命令行上并删除 open称呼。那么循环必须是 while (<>) { ... } .

    让我们知道到目前为止这是否正确,以及您还需要什么。

    use strict;
    use warnings;

    open my $fh, '<', 'mess-o-records.txt' or die $!;

    my $count = 0;

    while (<$fh>) {
    if (/^#matchee/) {
    print;
    $count = 0;
    }
    else {
    print if $count++ < 45;
    }
    }

    关于perl - sed、awk 或 perl : Pattern range match, 打印 45 行然后添加记录分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9843724/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com