Как отсортировать все строки между двумя шаблонами в файле в perl - PullRequest
0 голосов
/ 03 августа 2020

У меня есть текстовый файл, в котором есть строки, которые нужно отсортировать между двумя шаблонами.

Я пишу сценарий Perl, но, похоже, не дает результата.

Ввод файл показан ниже:

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

Примечание. Все строки между шаблоном BEGIN и END необходимо отсортировать. Любой указатель на сценарий Perl по этому поводу приветствуется.

Ответы [ 2 ]

4 голосов
/ 03 августа 2020
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 истинна, если мы внутри блока между шаблонами
  • Для строк внутри блока мы не печатаем их, а сохраняем в массиве, см. pu sh
  • В последней строке блока мы удалите сохраненные строки из массива, отсортируйте их по номерам, которые они содержат (или какому угодно другому), и распечатайте. См. splice , sort . Затем мы печатаем строку образца END.
  • Вне блока образца мы просто печатаем строки. Если мы встречаем там шаблон BEGIN, мы устанавливаем флаг $ inside равным 1, чтобы начать обработку блока.
2 голосов
/ 03 августа 2020

Работает следующий сценарий 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/;
}

Сортировка лексически по полным строкам. Уточните критерии сортировки или измените их по своему усмотрению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...