Parsing de dados multidimensionais em parágrafos

1

Estou tentando analisar dados de um relatório em PDF e filtrar alguns elementos interessantes. Usando pdftotext -layout , recebo dados neste formato como meu ponto de partida:

Record   Info           Interesting  
123      apple          yep         
         orange         nope         
         lemon          yep          
----------------------------------------------- 
456      dragonfruit    yep
         cucumber       nope         
-----------------------------------------------
789      kumquat        nope         
         lychee         yep          
         passionfruit   yep          
         yam            nope         
-----------------------------------------------
987      grapefruit     nope         

Minha saída pretendida é essa - todas as frutas ' Interesting ' e seu número de registro exceto quando a fruta é a primeira fruta em seu registro:

Record   Info
123      lemon
789      lychee
789      passionfruit

Atualmente, inspirado por esta questão , estou substituindo os delimitadores de registro ------ por \n\n e removendo os cabeçalhos de registro usando sed . Então, posso encontrar parágrafos com registros correspondentes com awk :

awk -v RS='' '/\n   .....................yep/'

(Descobrir como escrever {3}.{21} ou similar com um dos awk s é definitivamente uma batalha para outro dia: /)

Isso produz os parágrafos limpos da seguinte forma:

123      apple          yep         
         orange         nope         
         lemon          yep          

789      kumquat        nope         
         lychee         yep          
         passionfruit   yep          
         yam            nope         

A partir daqui, consegui o resultado desejado:

  • adicionando uma segunda coluna de número de registro, preenchida na primeira coluna de número de registro ou na segunda coluna de número de registro da linha anterior
  • excluir linhas que têm um número de registro na primeira coluna
  • exclua linhas que não sejam interessantes
  • cut das colunas finais

Estou indo bem na direção certa aqui, ou existe uma maneira mais simples de analisar dados multidimensionais? Talvez por grep ping de uma linha interessante (tem yep e nenhum número de registro), então grep de lá para a próxima linha com um número de registro não-vazio?

    
por Jack Deeth 15.07.2017 / 00:19

1 resposta

2

Você pode estar supercomplicando as coisas:

$ cat input
Record   Info           Interesting
123      apple          yep
         orange         nope
         lemon          yep
-----------------------------------------------
456      dragonfruit    yep
         cucumber       nope
-----------------------------------------------
789      kumquat        nope
         lychee         yep
         passionfruit   yep
         yam            nope
-----------------------------------------------
987      grapefruit     nope
$ awk 'BEGIN {OFS="\t"; print "Record","Info"} NF==3 && NR!=1 { number=$1 } NF!=3 && $2 ~ /yep/ {print number,$1}' input
Record  Info
123     lemon
789     lychee
789     passionfruit

Para tornar o script awk um pouco mais veritcal, para explicar como funciona:

BEGIN {                    # This block executes before any data
   OFS="\t";               # are parsed, and simply prints a header.
   print "Record","Info"
}
NF==3 && NR!=1 {           # This block will run on any row (line)
   number=$1               # with three fields other than the first
}
NF!=3 && $2 ~ /yep/ {      # On rows with three fields where the second
   print number,$1         # matches the regex /yup/, print the number
}                          # grabbed before, and the fruit.
    
por 15.07.2017 / 00:33