Como analisar um arquivo para extrair 3 números de dígitos mantidos em um “número de grupo”

4

Eu sou iniciante e estou tentando escrever um script de shell para analisar um arquivo de texto extraído de um arquivo PDF de padronização. Eu gostaria de cada grupo de teste (identificado pelo Grupo 0, Grupo 1 ... para obter a lista de números de teste, como 101, 102, 412 ... para o grupo 0. Eu tentei sed, awk, mas eu faço não tenho habilidades suficientes para ter sucesso Idealmente eu gostaria de obter a saída traduzida em código LaTeX, ou seja, cada item de saída cercado por uma string adequada, como

\section{Group0}
\Testdetails{101}
\Testdetails{102}
...............
\section{Group1}
\Testdetails{305}
................

Este é o arquivo de origem.

                                                Table 6

                       Tests                     EN 2591-                   Remarks

                                                            All models
 Group 0
 Visual examination                                101
 Examination of dimensions and mass                102      To be performed on one pair per layout, in
                                                            sealed and un-sealed versions
 Contact insertion and extraction forces           412      To be performed on one pair per layout, in
                                                            sealed and un-sealed versions
 Measurement of insulation resistance              206      Only specimens of group 6
 Voltage proof test                                207      Only specimens of group 6
 Contact resistance - Low level                    201
 Contact resistance at rated current               202
 Mating and unmating forces                        408      On specimens of groups 2, 4 and 6
 Visual examination                                101
 Group 1
 Rapid change of temperature                       305
 Visual examination                                101
 Interfacial sealing                               324
 Measurement of insulation resistance              206      Immersed connectors
 Voltage proof test                                207      Immersed connectors
 Insert retention in housing (axial)               410
 Contact retention in insert                       409
 Mechanical strength of rear accessories           420
 Contact retention system effectiveness            426
 (removable contact walkout)
 Visual examination                                101
 Group 2
 Contact retention in insert                       409
 Rapid change of temperature                       305
    
por Yves 08.05.2012 / 16:57

3 respostas

3
awk '
    $1 == "Group" {printf("\section{%s%d}\n", $1, $2); next}
    {for (i=1; i<=NF; i++) 
        if ($i ~ /^[0-9][0-9][0-9]$/) {
            printf("\Testdetails{%d}\n", $i)
            break
        }
    }
' 

Atualizar com base no comentário:

awk '
    $1 == "Group" {printf("\section{%s %d}\n", $1, $2); next}
    {
      title = sep = ""
      for (i=1; i<=NF; i++) 
        if ($i ~ /^[0-9][0-9][0-9]$/) {
          printf("\subsection{%s} \Testdetails{%d}\n", title, $i)
          break
        }
        else {
          title = title sep $i
          sep = FS
        }
    }
' 
    
por 08.05.2012 / 17:23
2

Uma maneira com perl usando regexp e assumindo infile tem o conteúdo que você postou na pergunta.

Conteúdo de script.pl :

use warnings;
use strict;

while ( <> ) { 
    chomp;
    if ( m/\A\s*(Group)\s*(\d+)/ ) { 
        printf qq[\Section{%s}\n], $1 . $2; 
        next;
    }   

    if ( m/\s(\d{3})(?:\s|$)/ ) { 
        printf qq[\Testdetails{%s}\n], $1; 
    }   
}

Execute como:

perl script.pl infile

Com a seguinte saída:

\Section{Group0}                                      
\Testdetails{101}                                      
\Testdetails{102}                                      
\Testdetails{412}                                      
\Testdetails{206}                                      
\Testdetails{207}                                      
\Testdetails{201}                                      
\Testdetails{202}                                     
\Testdetails{408}                                      
\Testdetails{101}                                      
\Section{Group1}                                      
\Testdetails{305}                                     
\Testdetails{101}                                     
\Testdetails{324}                                     
\Testdetails{206}                                      
\Testdetails{207}                                        
\Testdetails{410}
\Testdetails{409}
\Testdetails{420}
\Testdetails{426}
\Testdetails{101}
\Section{Group2}
\Testdetails{409}
\Testdetails{305}
    
por 08.05.2012 / 17:13
2

Para completar, aqui está uma versão sed :

sed -n -e 's#^ *Group \([0-9]\+\).*#\Section{Group}#p' \
       -e 's#.*\b\([0-9][0-9][0-9]\)\b.*#\Testdetails{}#p'
    
por 08.05.2012 / 17:43

Tags