Puxa várias linhas de dados de 2 colunas em vários locais

1

Eu tenho alguns arquivos de dados mal formatados e, infelizmente, o formato dos arquivos produzidos não pode ser alterado. Eu estava usando o GAWK para analisar os dados em um formato gerenciável, mas agora recebi um novo conjunto de arquivos que usam um layout ligeiramente diferente.

Usando o exemplo abaixo, precisei descobrir se existe uma maneira de puxar todas as linhas das duas primeiras colunas de dados mostradas abaixo de "cell". Eu entendo que posso continuar copiando e colando getline; print $1,$2 , mas o número de linhas pode variar entre 2 e 10000. Existe uma maneira de criar um loop que lerá todas as linhas, parando quando encontrar texto ou "=" de um número?

Conjunto de dados:

 1tally        8        nps =  2000000000       
       particle(s): neutrons 
       this tally is modified

 cell  20001                                                                                                                           
      energy   
    0.0000E+00   0.00000E+00 0.0000
    1.0000E-05   1.10650E-06 0.0213
    1.0000E-03   1.15086E-04 0.0021
    1.0000E-01   8.12322E-03 0.0002
    1.9231E-01   3.65758E-03 0.0004
    2.5000E+00   0.00000E+00 0.0000
      total      1.60091E-02 0.0002

 ===================================================================================================================================

           results of 10 statistical checks

1tally       38        nps =  2000000000
      particle(s): neutrons 
      this tally is modified

 cell  20001                                                                                                                           
      energy   
    0.0000E+00   0.00000E+00 0.0000
    1.0000E-05   1.10650E-06 0.0213
    1.0000E-03   1.15086E-04 0.0021
    1.0000E-01   8.12322E-03 0.0002
    1.2400E-01   1.20892E-03 0.0006
    1.4800E-01   1.00911E-03 0.0007
    1.7200E-01   8.39342E-04 0.0008
    1.9600E-01   6.99704E-04 0.0008
      total      1.60091E-02 0.0002

 ===================================================================================================================================

           results of 10 statistical checks

Tentativa atual:

/^1tally.*[0-9]/ {print $2};
/^ cell/ {getline; getline; print $1,$2}

Formato de saída:

8
0.0000E+00   0.00000E+00
1.0000E-05   1.10650E-06
1.0000E-03   1.15086E-04
1.0000E-01   8.12322E-03
1.9231E-01   3.65758E-03
2.5000E+00   0.00000E+00

38
0.0000E+00   0.00000E+00
1.0000E-05   1.10650E-06
1.0000E-03   1.15086E-04
1.0000E-01   8.12322E-03
1.2400E-01   1.20892E-03
1.4800E-01   1.00911E-03
1.7200E-01   8.39342E-04
1.9600E-01   6.99704E-04
    
por Jess 18.04.2017 / 22:44

1 resposta

1
# print lines from /energy/ to /total/, not inclusive
awk '/total/{p=0};p;/energy/{p=1}' /path/to/input

Isso definirá somente awk set p para 1 quando /energy/ for visto e defina p para 0 quando /total/ for visto. O p (a condição que desencadeia a impressão das linhas) será então 1 nas linhas que você deseja imprimir.

Isso pode ser refinado para imprimir exatamente os dados desejados:

$ awk '/total/{p=0} p==1 {print $1,$2} /energy/{p=1}' input
0.0000E+00 0.00000E+00
1.0000E-05 1.10650E-06
1.0000E-03 1.15086E-04
1.0000E-01 8.12322E-03
1.9231E-01 3.65758E-03
2.5000E+00 0.00000E+00

Para imprimir também o segundo campo quando vir /1tally/ , basta adicionar um acionador específico:

$ awk '/1tally/ {print $2}  /total/{p=0} p==1 {print $1,$2} /energy/{p=1}' input
8
0.0000E+00 0.00000E+00
1.0000E-05 1.10650E-06
1.0000E-03 1.15086E-04
1.0000E-01 8.12322E-03
1.9231E-01 3.65758E-03
2.5000E+00 0.00000E+00

Para colocar uma linha em branco entre cada bloco de bloco, use /total/{p=0; print ""}

    
por 18.04.2017 / 23:20