2017-02-10 1 views
2

Пример текста:СЕПГ, AWK или аналогичный - удалить всю строку и 2 строки выше, если шаблон совпадает с последующей пустой строкой

heading1 
heading2 
data 
data 
data 

heading1 
heading2 

heading1 
heading2 
data 
data 
data 

Я хочу, чтобы удалить раздел в середине, который не имеет каких-либо данных , То есть; если за заголовком 2 следует пустая строка, удалите заголовок2, заголовок 1 и пустую строку выше.

Я нашел, как удалить строки только после того, как их следует пустая строка, и как удалить n строк выше/ниже шаблона, но не может решить, как объединить эти два.

Спасибо.

ответ

8

Вы можете использовать awk:

awk 'BEGIN{RS=ORS="\n\n";FS="\n"} NF>2' input.file 

Хотя awk по умолчанию работает на каждой строке основе записи не обязательно должны быть в одной строке. Используя RS (входной разделитель записей), вы можете определить, как записей отделены друг от друга.

Я устанавливаю RS в блоке BEGIN на пустую строку для разделения записей по абзацам и FS на новую строку, чтобы разделить поля по новой строке.

NF hold - это количество полей в текущей записи. NF>2 проверяет любую запись, содержащую более 2 строк, - и если это условие выполнено, awk распечатывает запись.

ORS является Выходная запись разделитель. Я устанавливаю его на пустую строку, как FS, чтобы разделить отдельные записи на выходе.

+0

OK, это похоже на работу. Благодарю. Я буду тестировать его более подробно в понедельник (это домашнее время, и это связано с работой). Можете ли вы объяснить, что делает каждая часть? – Darren

+0

@ Inian Что непонятно? – hek2mgl

+0

@ hek2mgl: Попытка получить представление сейчас, '++' за инновации! – Inian

2

Вот подобный подход, который позволит устранить печать последнюю пустую строку:

awk -v RS= 'NF>2{print sep $0; sep=ORS}' file 
+0

Ницца ....... – hek2mgl

+0

Не мог заставить этот работать. – Darren

1

Это может работать для вас (GNU СЭД):

sed ':a;N;/^$/M!ba;s/\n/&/3;t;d' file 

хранения записей с разделителями пустой строкой, в пространстве шаблонов. Если запись содержит 3 или более строк новой строки, напечатайте ее в противном случае.

Смежные вопросы