Как насчет этого, без использования l oop. Не могли бы вы попробовать следующее. Подробное объяснение будет добавлено через несколько минут.
awk '
match($0,/OX=[0-9]+/){
val=substr($0,RSTART,RLENGTH)
if(gsub(val,"&")==2){
print
found=1
}
val=""
next
}
found{
found=""
print
}
' Input_file
ИЛИ небольшое редактирование в вышеупомянутом решении, где удаляется val=""
часть согласно @Quasimodo комментарию:
awk '
match($0,/OX=[0-9]+/){
val=substr($0,RSTART,RLENGTH)
if(gsub(val,"&")==2){
print
found=1
}
next
}
found{
found=""
print
}
' Input_file
Объяснение: Добавление подробного пояснения к приведенному выше коду.
awk ' ##Starting awk program from here.
match($0,/OX=[0-9]+/){ ##Using match function to match OX= digits in current line.
val=substr($0,RSTART,RLENGTH) ##Creating variable val whose value is sub-string of value of current line starts from RSTART till value of RLENGTH.
if(gsub(val,"&")==2){ ##Checking condition if value of Global substitutions is equal to 2 then do following.
print ##Printing the current line.
found=1 ##Setting variable found value as 1 here.
}
val="" ##Nullifying variable val here.
next ##next will skip all further statements from here.
}
found{ ##Checking condition if variable found is NOT NULL then do following.
found="" ##Nullifying variable found here.
print ##Printing current line here.
}
' Input_file ##Mentioning Input_file name here.
РЕДАКТИРОВАТЬ: ПРИМЕЧАНИЕ, этот код пытается охватить крайний случай, если чьи-либо сэмплы точно такие же, как показано OP, то приведенные выше коды должны быть достаточно хорошими.
Пытаясь охватить крайний случай, упомянутый @kvantour в комментариях, немного изменил регулярное выражение, где перед ним следует проверять, например, OX
, за которым следует пробел.
awk '
match($0,/\s+OX=[0-9]+\s+/){
val=substr($0,RSTART,RLENGTH)
if(gsub(val,"&")==2){
print
found=1
}
val=""
next
}
found{
found=""
print
}
' Input_file