Isso pode ser feito dividindo e conquistando o texto. O script Python abaixo faz exatamente isso - ele lê o arquivo linha por linha, coletando todas as linhas relacionadas a um pedido e, em seguida, passa essas informações para a função que analisa cada ordem para determinar se deve ou não ser impressa. Embora seja ligeiramente detalhado, funciona de forma bastante decente, embora sejam efetivamente dois loops aninhados que provavelmente darão o desempenho O (n ^ 2) .
#!/usr/bin/env python
import sys
def parse_order(order,order_lines):
flag1 = False
flag2 = False
xp_counter = 0
ap_counter = 0
for line in order_lines:
if 'Wrong Trace:' in line:
words = line.split()
if 'NOUN:' in words[-2] and 'XP' in words[-1]:
flag1 = True
continue
if 'NOUN:' in words[-2] and 'AP' in words[-1]:
flag2 = True
continue
if flag1 and 'A/A' in line: xp_counter += 1
if flag2 and ( 'Y/Y' in line or 'U/U' in line):
ap_counter += 1
if xp_counter == 2 or ap_counter == 2:
return
print("".join([order]+order_lines))
def main():
buffer=[]
last_order = None
with open(sys.argv[1]) as fp:
for line in fp:
if line.startswith('ORDER'):
current_order = line
if not last_order:
last_order = current_order
continue
parse_order(last_order,buffer)
last_order = current_order
buffer = []
continue
buffer.append(line)
parse_order(last_order,buffer)
if __name__ == '__main__': main()
O script foi testado com um arquivo de entrada ligeiramente modificado do OP. Como você pode ver abaixo, BURY
e ALUIO
são ignorados:
$ ./parse_orders.py input.txt
ORDER ALPHA
Facility: 201 ZZZ COUNTRY
Wrong Trace: Kotak: NA Soak: NA NOUN: XP
O O O O O O O O O O O O O O
O O O O O O O O O O O O O O LAM
AMO ORDER # P/P R O L H S C N D K M D D C N LAM uii ii oo
--- -------- --- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --- --- -- --
BZ90rty K/K AA AA AA NA XP AP NA NA NA NA NA NA AP AP OOL XP IP N
a ZX A/A WD WD WD NA WD WD NA NA NA NA NA NA WD WD OOL WD IP Y
ORDER GAMMA
Facility: 201 ZZZ COUNTRY
Wrong Trace: Kotak: NA Soak: NA NOUN: XP
O O O O O O O O O O O O O O
O O O O O O O O O O O O O O LAM
AMO ORDER # P/P R O L H S C N D K M D D C N LAM uii ii oo
--- -------- --- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --- --- -- --
BZ90rty K/K AA AA AA NA XP AP NA NA NA NA NA NA AP AP OOL XP IP N
a ZX A/A WD WD WD NA WD WD NA NA NA NA NA NA WD WD OOL WD IP Y