Предполагая, что ответ не должен основываться на sed
...
Мы можем использовать egrep
, чтобы сохранить только те строки, которые соответствуют одному из следующих критериев:
- строка содержит двоеточие с начальным / конечным пробелом (
:
) или словом violation
(без учета регистра) - из полученных строк мы затем отбрасываем строки, содержащие
0 violations
На данный момент у нас есть:
$ egrep -i " : |violation" a.txt | egrep -v " 0 violations"
DK2.a.Iq_abc_vu : To avoid > 500 um x 500.0 um Metal empty space after IP abutment empty space must on IP boundary corner
interacting ........................................ 1 violation found.
interacting ........................................ 1 violation found.
DM3.a.7.abc_vu : To avoid > 100.0 um x 100.0 um Metal empty space after TV boundary corner having some thing
interacting ........................................ 2 violations found.
LAP.ABCD.1 : Voltage high this is one type of error coming some thing violations. This error can be removed by providing spacing
net_abcd:net_abcd .............................. 1 violation found.
net_abcd:net_abcd .............................. 1 violation found.
net_abcd:net_abcd .............................. 10 violation found.
net_abcd:net_abcd .............................. 1 violation found.
11xAB2_B_1 : 10xAB area >= 100um2
Violation
text_abcd:text_pqrs .......................... 2 violations found.
text_jkl:jkl_jkl ............................. 2 violations found.
Теперь мы можем использовать awk
для отслеживания 2 типов ошибок:
- (1) строка содержит
[space]:[space]
, поэтому мы сохраняем имя ошибки и, если следующая строка содержит строку violation
, мы печатаем имя ошибки и затем очищаем имя ошибки (чтобы не печатать его дважды) - (2) строка начинается с
^Violation
, и в этом случае мы получим / напечатаем имя ошибки из каждой последующей строки, содержащей строку violation
(имя ошибки - это часть строки перед :
)
Код awk
для реализации этого выглядит следующим образом:
awk '
/ : / { errname = $1 ; next }
/^Violation/ { errname = $1 ; next }
/violation/ { if ( errname == "Violation" ) { split($1,a,":") ; print a[1] ; next }
if ( errname != "" ) { print errname ; errname="" ; next }
}
'
Потянув egrep
и awk
s nippets вместе дает нам:
$ egrep -i " : |violation" a.txt | egrep -v " 0 violations" | awk '
/ : / { errname = $1 ; next }
/^Violation/ { errname = $1 ; next }
/violation/ { if ( errname == "Violation" ) { split($1,a,":") ; print a[1] ; next }
if ( errname != "" ) { print errname ; errname="" ; next }
}
'
Со следующими результатами:
DK2.a.Iq_abc_vu
DM3.a.7.abc_vu
LAP.ABCD.1
text_abcd
text_jkl