Remover linhas de um arquivo após as N linhas iniciais, mas antes para o número inteiro

0

Eu tenho um arquivo como este:

    1         2         3         4         5
 0.05775  0.00238  0.02514   0.00469  0.01882
 0.26868  0.04114  0.09359  0.02155  0.01367
 0.11413  0.00907  0.04032  0.02487   0.01156
 0.03759  0.00624  0.00819  0.01527   0.01128
 0.09910  0.03416  0.02280  0.00627   0.00433
    6         7         8         9        10
0.01798   0.00035   0.00672  0.02180  0.00184
0.01880  0.00834   0.04975  0.05503   0.00234
0.00242  0.00618   0.04936  0.02320   0.00269
 0.00931  0.00611   0.02371  0.00299   0.00353
 0.00763  0.00197  0.00673  0.00338   0.00182
   11        12        13        14        15
 0.00330   0.00521   0.00495   0.00426   0.00403
0.01121   0.02891   0.02162   0.02235   0.01534
0.01081   0.01871   0.00888   0.01835   0.00867
0.00684   0.00965   0.00645   0.00802   0.00317
0.00671   0.00333   0.00376  0.00204   0.00028

Este exemplo contém três blocos principais de informação. A primeira fila de cada bloco contém sempre um número inteiro, enquanto as outras linhas contém números decimais. Eu quero pegar as primeiras 4 linhas de cada bloco.

Saída:

    1         2         3         4         5
 0.05775  0.00238  0.02514   0.00469  0.01882
 0.26868  0.04114  0.09359  0.02155  0.01367
 0.11413  0.00907  0.04032  0.02487   0.01156
    6         7         8         9        10
0.01798   0.00035   0.00672  0.02180  0.00184
0.01880  0.00834   0.04975  0.05503   0.00234
0.00242  0.00618   0.04936  0.02320   0.00269
   11        12        13        14        15
 0.00330   0.00521   0.00495   0.00426   0.00403
0.01121   0.02891   0.02162   0.02235   0.01534
0.01081   0.01871   0.00888   0.01835   0.00867

Eu estava tentando fazer algo com sed mas sem sucesso.

    
por alloppp 23.02.2018 / 20:00

2 respostas

2

Eu perguntei:

Do all blocks have one header line and exactly five lines of data? Or do some rows have variable amounts?

Se for exatamente 6 linhas por bloco, você pode usar:

sed -n 'N;N;N;p;N;N' file.txt

Mas se não, use:

sed -n '/\./!{N;N;N;p;}' file.txt

O último comando, ao encontrar uma linha sem nenhum ponto, imprimirá essa e as três linhas seguintes (sem verificar se há pontos). Em seguida, ele irá ignorar as seguintes linhas até que outro seja encontrado e não tenha períodos.

Se puder, recomendo que você corrija a ferramenta que fornece esses dados para que ela seja apresentada em um formato mais sensato.

    
por 23.02.2018 / 21:26
0
$ awk -v RS='\n  ' '{
   count=split($0,lines,/\n/);
   lines[1]="  "lines[1];
   max=4 ; if (count < max) { max = count };
   for (i=1; i <= max; i++) print lines[i];
  }' input 
     1         2         3         4         5
0.05775  0.00238  0.02514   0.00469  0.01882
0.26868  0.04114  0.09359  0.02155  0.01367
0.11413  0.00907  0.04032  0.02487   0.01156
    6         7         8         9        10
0.01798   0.00035   0.00672  0.02180  0.00184
0.01880  0.00834   0.04975  0.05503   0.00234
0.00242  0.00618   0.04936  0.02320   0.00269
   11        12        13        14        15
0.00330   0.00521   0.00495   0.00426   0.00403
0.01121   0.02891   0.02162   0.02235   0.01534
0.01081   0.01871   0.00888   0.01835   0.00867

Este script awk faz uso do fato de que as linhas de cabeçalho de cada bloco começam com pelo menos dois espaços, enquanto as linhas de dados não. Se definirmos o separador de registro ( RS ) para uma nova linha seguida de dois espaços, poderemos processar cada bloco individualmente.

Cada bloco é então dividido em linhas individuais. A primeira linha tem dois caracteres de espaço pré-pendentes (para substituir os espaços consumidos pelo separador de registro) e, em seguida, as primeiras 4 linhas são impressas (ou menos, se houver menos de 4 linhas em um bloco). / p>     

por 24.02.2018 / 01:58