A solução mais simples seria simplesmente adicionar outro getline
e obter 5 linhas em vez de 6:
$ awk '/z ~/ {getline;for(i=1; i<=5; i++) {getline; print $4, $5, $6}}' file
0.00781 0.00108 0.00038
0.01271 -0.01507 0.02839
-0.05015 -0.01803 0.01588
0.01733 0.03089 -0.04611
0.01230 0.00114 0.00147
Pessoalmente, eu teria feito isso de uma maneira um pouco diferente:
$ awk '/z ~/{f=2;} /~ ~/{f--}; (f==1 && NF>5){print $4, $5, $6} ' file
0.00781 0.00108 0.00038
0.01271 -0.01507 0.02839
-0.05015 -0.01803 0.01588
0.01733 0.03089 -0.04611
0.01230 0.00114 0.00147
A ideia aqui é definir um sinalizador (a variável f
) como 2
na linha que corresponde a z ~
e diminuir seu valor em um a cada vez que encontrarmos uma linha correspondente a ~ ~
. Em seguida, imprimimos os campos 4, 5 e 6 somente nas linhas em que f
é 1
e que tem pelo menos 5 campos.
Para ambos os exemplos, para obter uma impressão bonita, você pode usar -vOFS="\t"
ou melhor ainda printf
:
$ awk '/z ~/{f=2;} /~ ~/{f--}; (f==1 && NF>5){printf "%10s%10s%10s\n", $4, $5, $6} ' file
0.00781 0.00108 0.00038
0.01271 -0.01507 0.02839
-0.05015 -0.01803 0.01588
0.01733 0.03089 -0.04611
0.01230 0.00114 0.00147