Recuperar líneas de un file dependiendo de otras líneas

Imagine la siguiente estructura de files:

foo.bar.1 blabla moreblabla relevant=yes foo.bar.2 relevant=no foo.bar.3 blablabla foo.bar.4 relevant=yes 

Quiero recuperar todas las líneas de foo.bar donde se encuentran el bloque siguiente y antes de la siguiente foo.bar hay una línea que indica relevant=yes .

Entonces la salida debería ser:

 foo.bar.1 foo.bar.4 

Por supuesto, podría escribir un progtwig / script iterando a través de las líneas, recordando las foo.bars e imprimiéndolas cuando haya una línea que diga relevant=yes siguiéndolas antes de la siguiente foo.bar . ¿Pero pensé que podría haber una forma de usar las utilidades estándar de Unix (grep / sed / awk)?

Gracias por cualquier pista!

Si la input se procesa línea por línea, entonces el procesamiento debe ser así:

  • si la línea actual es foo.bar , guárdela, olvidándose de cualquier línea anterior de foo.bar que no haya sido habilitada para la salida;
  • si la línea actual es relevant=yes , esto habilita la última foo.bar para la salida.

Este tipo de razonamiento es un trabajo para awk. (También se puede hacer en sed si le gusta el dolor).

 awk ' /^foo\.bar/ { foobar = $0 } /^relevant=yes$/ {if (foobar != "") {print foobar; foobar = ""}} ' 

Aquí hay una manera con sed :

 sed '/foo\.bar/h;/relevant=yes/!d;x;/foo\.bar/!d' infile 

Las líneas que coinciden con foobar se copyn en el espacio antiguo. Todas las líneas, excepto aquellas que coincidan con relevant=yes se elegirán. E x cambie espacio de retención con espacio de patrón (esto solo sucede cuando las líneas coinciden con relevant=yes ) y d elete si no coincide con foobar .

Manera pythonica:

 >>> with open("/home/xieerqi/textfile.txt") as file: ... for line in file: ... if line.__contains__("foo"): ... VAR = line ... if line.__contains__("relevant=yes"): ... print VAR ... foo.bar.1 foo.bar.4 

Reunidos en un guion:

 DIR:/xieerqi skolodya@ubuntu:$ chmod +x relevance.py DIR:/xieerqi skolodya@ubuntu:$ ./relevance.py textfile.txt foo.bar.1 foo.bar.4 DIR:/xieerqi skolodya@ubuntu:$ cat relevance.py #!/usr/bin/env python import sys with open(sys.argv[1]) as file: for line in file: if line.__contains__("foo"): VAR = line.strip("\n") if line.__contains__("relevant=yes"): print VAR