Grepping определенного образца с помощью команды sed - PullRequest
0 голосов
/ 10 марта 2020

У меня есть один файл (скажем, a.txt), содержимое которого показано ниже. Я хочу отображать только имена ошибок только перед двоеточием (:), например, DK2.a.Iq_abc_vu, LAP.ABCD.1, но не grep «11xAB2_B_1», так как значение нарушения равно 0, за исключением одного особого случая, упомянутого в конце вопроса. Мы должны отображать только те ошибки, значение которых не равно нулю (например, DK2.a.Iq_abc_vu, LAP.ABCD.1, но не 11xAB2_B_1, поскольку это значение показывает 0 нарушений). Формат файла .txt остается одинаковым для разных файлов. Здесь есть один особый случай, когда появляется слово «нарушение», в этом случае мы имеем grep «text_abcd» и «text_jkl» как ошибку, а не «нарушение». Можете ли вы помочь мне, как можно исправить эти ошибки, как показано в выводе ниже.

$ cat a.txt file
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  
not_inside ......................................... 0 violations found.

Violation  
text_abcd:text_pqrs .......................... 2 violations found.    
text_jkl:jkl_jkl ............................. 2 violations found.

Желаемый вывод:

DK2.a.Iq_abc_vu   
DM3.a.7.abc_vu  
LAP.ABCD.1  
text_abcd  
text_jkl

1 Ответ

0 голосов
/ 11 марта 2020

Предполагая, что ответ не должен основываться на 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...