У меня есть файл, содержащий записи, разделенные шаблоном / # matchee /. Эти записи имеют различную длину ... скажем, 45 - 75 строк. Они должны ALL иметь 45 строк и при этом поддерживать разделитель записей. Записи могут быть из разных отделов, название отдела указывается в строке 2 после пустой строки. Таким образом, разделитель записей можно рассматривать как просто / ^ # matchee / или / ^ matchee /, за которым следует \ n. Существует Deluxe редакция этой проблемы и Walmart редакция ...
ИЗБРАННОЕ ИЗДАНИЕ
Извлечение каждой записи по диапазону шаблонов, чтобы я мог сортировать записи по отделам. Например, с сед
sed -n '/^DEPARTMENT NAME/,/^#matchee/{p;}' mess-o-records.txt
Затем выведите только первые 45 строк каждой записи в файле для соответствия
ограничение 45 строк.
Наконец, убедитесь, что результат содержит разделитель записи в строке 45.
WALMART EDITION
То же, что и выше, но вместо использования диапазона просто используйте разделитель записей.
СТАТУС
Моя попытка это может прояснить, что я пытаюсь сделать.
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 строк.
- Снова включить разделитель тэков. Например, # матчи
Я думаю, что это было бы более гибко - т.е. может обрабатывать записи короче, чем 45 строк.
Вот рифф, основанный на примере Perl @ Borodin's:
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 строк на основе разделителя - pad - tack delimiter on.