Imprime linhas entre dois padrões que correspondem a uma condição no awk

1

Como posso imprimir linhas entre dois padrões que atendem a uma determinada condição?

Por exemplo, para um arquivo de entrada parcialmente contendo o seguinte:

Time         %MEM    %CPU    %SWAP
00:05:02      7.3     8.4     3.5
00:10:02      10      4.3     4.5
00:15:02      8.5     4.4     6.7
00:20:02      25.3    35.8    7.3
00:25:02      74.6    28.4    7.3
00:30:02      67.2    88.3    7.3
00:35:02      35.4    87.4    7.3
00:40:02      27.3    92.8    7.3
00:45:02      45.3    83.2    10.5
00:50:02      30      65.7    10.5
01:00:02      92.3    66.4    10.5
01:05:02      13.1    69.4    13.5
01:10:02      45.2    77.4    13.5
01:15:02      48.7    78.8    13.5
01:20:02      49.1    80.5    13.5
01:25:02      72      83.9    13.5
END

Eu gostaria de imprimir a primeira vez e o valor de swap para cada valor de swap maior que 7. Então minha saída seria:

00:20:02   7.3
00:45:02   10.5
01:05:02   13.5

Eu tentei:

awk '/%SWAP/{flag=1;next}/End/{flag=0}flag' myFile

que imprime todas as linhas. Eu também tentei:

awk '/%SWAP/ {flag=1;next}
     /End/{flag=0}
     {if ($10 > max) {max=$10; print $1 " " $2 " " $4}}' myFile

mas isso me dá saída das seções anteriores do arquivo para $4 .

Alguém tem uma solução para isso? Uma explicação seria muito apreciada.

    
por dabadie 26.02.2015 / 11:27

1 resposta

2

Você pode dizer:

$ awk '($4>7 && $4!=swap) {swap=$4; print $1, $4}' file
00:20:02 7.3
00:45:02 10.5
01:05:02 13.5

Ou seja, armazene o último valor de SWAP maior que 7 na variável swap e continue comparando o valor.

Você pode obter uma saída mais agradável configurando o separador do campo de saída para a guia: -v OFS="\t" ou BEGIN {OFS="\t"} . Ou você também pode canalizar para column -t .

    
por 26.02.2015 / 11:35