Удалить блок строк из файла в зависимости от наличия строки в предыдущей строке, затем позже другой

#shell #awk #sed

#оболочка #awk #sed

Вопрос:

У меня есть 25-строчный файл, который выглядит как:
cat -n oz

1 PARSING IN CURSOR #140499 dep=0 tim=4217919222030 sqlid='ftf4q8xj38z7k'
2 WAIT #1404991: nam='SQL*Net message' ela= 1 tim=4217919224736
3 WAIT #1404991: nam='SQL*Net message' ela= 655 tim=4217919225409
4 PARSING IN CURSOR #140499 dep=0 tim=4217919225606 sqlid='9fufagwmu041b'
5 WAIT #1404991: nam='SQL*Net message' ela= 1 tim=4217919225677
6 WAIT #1404991: nam='SQL*Net message' ela= 736 tim=4217919226432
7 PARSING IN CURSOR #140499 dep=0 tim=4217919226577 sqlid='bzdm0nbr7c036'
8 WAIT #1404990: nam='SQL*Net message' ela= 1 tim=4217919226665
9 WAIT #1404990: nam='SQL*Net message' ela= 2027 tim=4217919228710
10 WAIT #1404991: nam='SQL*Net message' ela= 1 tim=4217919228849
11 PARSING IN CURSOR #140499 dep=1 tim=4217919225606 sqlid='9fufagwmu041b'
12 WAIT #1404991: nam='SQL*Net message' ela= 603 tim=4217919229470
13 WAIT #1404991: nam='SQL*Net message' ela= 1 tim=4217919229647
14 WAIT #1404991: nam='SQL*Net message' ela= 521 tim=4217919230185
15 WAIT #1404991: nam='SQL*Net message' ela= 0 tim=4217919230330
16 WAIT #1404991: nam='SQL*Net message' ela= 758 tim=4217919231107
17 WAIT #1404990: nam='SQL*Net message' ela= 0 tim=4217919231222
18 WAIT #1404990: nam='SQL*Net message' ela= 1635 tim=4217919232874
19 PARSING IN CURSOR #140499 dep=0 tim=4217919226577 sqlid='bzdm0nbr7c036'
20 WAIT #1404990: nam='SQL*Net message' ela= 1 tim=4217919226665
21 WAIT #1404990: nam='SQL*Net message' ela= 2027 tim=4217919228710
22 PARSING IN CURSOR #140499 dep=1 tim=4217919225606 sqlid='9fufagwmu041b'
23 WAIT #1404991: nam='SQL*Net message' ela= 521 tim=4217919230185
24 WAIT #1404991: nam='SQL*Net message' ela= 0 tim=4217919230330
25 WAIT #1404991: nam='SQL*Net message' ela= 758 tim=4217919231107

что я хочу преобразовать в («cat -n» того же файла после обработки):
1 PARSING IN CURSOR #140499 dep=0 tim=4217919222030 sqlid='ftf4q8xj38z7k'
2 WAIT #1404991: nam='SQL*Net message' ela= 1 tim=4217919224736
3 WAIT #1404991: nam='SQL*Net message' ela= 655 tim=4217919225409
4 PARSING IN CURSOR #140499 dep=0 tim=4217919225606 sqlid='9fufagwmu041b'
5 WAIT #1404991: nam='SQL*Net message' ela= 1 tim=4217919225677
6 WAIT #1404991: nam='SQL*Net message' ela= 736 tim=4217919226432
7 PARSING IN CURSOR #140499 dep=0 tim=4217919226577 sqlid='bzdm0nbr7c036'
8 WAIT #1404990: nam='SQL*Net message' ela= 1 tim=4217919226665
9 WAIT #1404990: nam='SQL*Net message' ela= 2027 tim=4217919228710
10 WAIT #1404991: nam='SQL*Net message' ela= 1 tim=4217919228849
11 PARSING IN CURSOR #140499 dep=0 tim=4217919226577 sqlid='bzdm0nbr7c036'
12 WAIT #1404990: nam='SQL*Net message' ela= 1 tim=4217919226665
13 WAIT #1404990: nam='SQL*Net message' ela= 2027 tim=4217919228710

Алгоритм таков:
o содержит ли первая строка (всегда будет начинаться с «PARS …») «dep = 1» ?,
o если да, я продолжаю чтение, не выводя ничего до следующего «PARS …»,
o если содержит «dep = 0», я показываю его вместе с последующими,до следующего «PARS …»,
o затем снова ту же проверку, … и т.д.

Насколько легко это можно сделать? Возможно, используя простую команду оболочки (cat и т. Д.)? Но мой файл довольно большой …
большое спасибо.
Seb

Комментарии:

1. Пожалуйста, добавьте к образцу данных (и отсутствующим ожидаемым результатам и проделанной работе при их публикации) 4 пробела для лучшей читаемости. Кроме того, вы должны решить, хотите ли вы строки от n до nn или фильтрацию на основе содержимого. Спасибо. О, как легко это можно сделать , я бы использовал awk или sed для этого, в зависимости. Добавьте эти теги тоже.

Ответ №1:

Просто сделайте что-то вроде:

 awk '/^PARSING IN CURSOR/{ t = match($0, "dep=1")} !t' input
 

Каждый раз, когда строка ввода совпадает PARSING IN CURSOR , проверяйте, соответствует ли строка строке dep=1 , и устанавливайте t соответственно. !t Вызывает вывод строки, если dep=1 ее не было в заголовке. Если dep=1 было в заголовке, то !t значение false и вывод не генерируется.

например:

 $ cat input
PARSING IN CURSOR #140499 dep=0 tim=4217919222030  sqlid='ftf4q8xj38z7k'
WAIT #1404991: nam='SQL*Net message' ela= 1 tim=4217919224736
WAIT #1404991: nam='SQL*Net message' ela= 655 tim=4217919225409
PARSING IN CURSOR #140499 dep=0 tim=4217919225606  sqlid='9fufagwmu041b'
WAIT #1404991: nam='SQL*Net message' ela= 1 tim=4217919225677
WAIT #1404991: nam='SQL*Net message' ela= 736 tim=4217919226432
PARSING IN CURSOR #140499 dep=0 tim=4217919226577  sqlid='bzdm0nbr7c036'
WAIT #1404990: nam='SQL*Net message' ela= 1 tim=4217919226665
WAIT #1404990: nam='SQL*Net message' ela= 2027 tim=4217919228710
WAIT #1404991: nam='SQL*Net message' ela= 1 tim=4217919228849
PARSING IN CURSOR #140499 dep=1 tim=4217919225606  sqlid='9fufagwmu041b'
WAIT #1404991: nam='SQL*Net message' ela= 603 tim=4217919229470
WAIT #1404991: nam='SQL*Net message' ela= 1 tim=4217919229647
WAIT #1404991: nam='SQL*Net message' ela= 521 tim=4217919230185
WAIT #1404991: nam='SQL*Net message' ela= 0 tim=4217919230330
WAIT #1404991: nam='SQL*Net message' ela= 758 tim=4217919231107
WAIT #1404990: nam='SQL*Net message' ela= 0 tim=4217919231222
WAIT #1404990: nam='SQL*Net message' ela= 1635 tim=4217919232874
PARSING IN CURSOR #140499 dep=0 tim=4217919226577  sqlid='bzdm0nbr7c036'
WAIT #1404990: nam='SQL*Net message' ela= 1 tim=4217919226665
WAIT #1404990: nam='SQL*Net message' ela= 2027 tim=4217919228710
PARSING IN CURSOR #140499 dep=1 tim=4217919225606  sqlid='9fufagwmu041b'
WAIT #1404991: nam='SQL*Net message' ela= 521 tim=4217919230185
WAIT #1404991: nam='SQL*Net message' ela= 0 tim=4217919230330
WAIT #1404991: nam='SQL*Net message' ela= 758 tim=4217919231107
$ awk '/^PARSING IN CURSOR/{ t = match($0, "dep=1")} !t' input
PARSING IN CURSOR #140499 dep=0 tim=4217919222030  sqlid='ftf4q8xj38z7k'
WAIT #1404991: nam='SQL*Net message' ela= 1 tim=4217919224736
WAIT #1404991: nam='SQL*Net message' ela= 655 tim=4217919225409
PARSING IN CURSOR #140499 dep=0 tim=4217919225606  sqlid='9fufagwmu041b'
WAIT #1404991: nam='SQL*Net message' ela= 1 tim=4217919225677
WAIT #1404991: nam='SQL*Net message' ela= 736 tim=4217919226432
PARSING IN CURSOR #140499 dep=0 tim=4217919226577  sqlid='bzdm0nbr7c036'
WAIT #1404990: nam='SQL*Net message' ela= 1 tim=4217919226665
WAIT #1404990: nam='SQL*Net message' ela= 2027 tim=4217919228710
WAIT #1404991: nam='SQL*Net message' ela= 1 tim=4217919228849
PARSING IN CURSOR #140499 dep=0 tim=4217919226577  sqlid='bzdm0nbr7c036'
WAIT #1404990: nam='SQL*Net message' ela= 1 tim=4217919226665
WAIT #1404990: nam='SQL*Net message' ela= 2027 tim=4217919228710