Recuperando linhas de um arquivo dependendo de outras linhas

3

Imagine a seguinte estrutura de arquivos:

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

Eu quero recuperar todas as foo.bar linhas onde dentro do bloco seguem a si mesmas e antes do próximo foo.bar há uma linha indicando relevant=yes .

Portanto, a saída deve ser:

foo.bar.1
foo.bar.4

Eu poderia, claro, escrever um programa / script percorrendo as linhas, lembrando o foo.bars e imprimi-los quando houver uma linha dizendo relevant=yes seguindo-os antes do próximo foo.bar . Mas eu pensei que poderia haver uma maneira out-of-the usando utilitários padrão do Unix (grep / sed / awk)?

Obrigado por qualquer sugestão!

    
por hal9000 31.01.2016 / 23:49

3 respostas

5

Se a entrada é processada linha por linha, então o processamento precisa ser assim:

  • se a linha atual for foo.bar , armazene-a, esquecendo qualquer linha foo.bar anterior que não tenha sido ativada para saída;
  • se a linha atual for relevant=yes , isso ativará a última foo.bar para saída.

Esse tipo de raciocínio é um trabalho para o awk. (Também pode ser feito em sed se você gosta de dor.)

awk '
    /^foo\.bar/ { foobar = $0 }
    /^relevant=yes$/ {if (foobar != "") {print foobar; foobar = ""}}
'
    
por 01.02.2016 / 00:41
3

Aqui está uma maneira com sed :

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

Linhas correspondentes a foobar são copiadas para h old space. Todas as linhas, exceto aquelas que correspondem a relevant=yes , são d eletidas. E x change ocupa espaço com espaço de padrão (isso só acontece quando as linhas correspondem a relevant=yes ) e d elete se ele não corresponde a foobar .

    
por 01.02.2016 / 00:48
1

Caminho Pythonic:

>>> 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

Coloque junto em um script:

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
    
por 01.02.2016 / 09:25