Pegue uma coisa de uma linha e concatene-a com uma coisa de outra linha

4

Eu tenho o seguinte:

2018-11-10 23:57:21 [COMMAND]: sar -u 10 5

AIX host 1 7    11/10/18

System configuration: lcpu=64  mode=Capped

23:57:21    %usr    %sys    %wio   %idle   physc
23:57:31      10       7       0      83   16.00
23:57:41       9       6       0      85   16.00
23:57:51       9       6       0      85   16.00
23:58:01       9       7       0      84   16.00
23:58:11      10       6       0      84   16.00

Average        9       6       0      84   16.00

2018-11-10 23:58:21 [COMMAND]: sar -u 10 5

AIX host 1 7    11/10/18

System configuration: lcpu=64  mode=Capped

23:58:21    %usr    %sys    %wio   %idle   physc
23:58:31      10       8       0      82   15.99
23:58:41       9       6       0      85   16.00
23:58:51       9       6       0      85   16.00
23:59:01       9       6       0      84   16.00
23:59:11      10       6       0      83   16.00

Average       10       6       0      84   16.00

Preciso de tempo com o valor médio de %idle :

2018-11-10 23:57:21|84
2018-11-10 23:58:21|84
    
por ammar 11.11.2018 / 14:02

3 respostas

11

Indo pelo seu arquivo de entrada no estado em que se encontra, um simples comando awk tão simples como o abaixo deve ser suficiente.

awk '/sar/{ time=$1" "$2; next }/Average/{ print time"|"$5 }' file
    
por 11.11.2018 / 14:16
5

Algumas escolhas:

  • awk

    $ awk '/COMMAND/{printf "%s %s", $1,$2}/Average/{print "|"$5}' file 
    2018-11-10 23:57:21|84
    2018-11-10 23:58:21|84
    
  • perl

    $ perl -ale '$k="$F[0] $F[1]" if /COMMAND/; print "$k|$F[4]" if /Average/' file 
    2018-11-10 23:57:21|84
    2018-11-10 23:58:21|84
    
por 11.11.2018 / 15:48
2

Esse tal de uma linha do Perl deve fazer o seguinte:

perl -lne'$d=$1 if /^(\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2})/;
if(/^Average\s+\S+\s+\S+\s+\S+\s+(\S+)/) {print "$d|$1";}'

(Eu fiz duas linhas, por isso é mais legível.) Você precisa alimentá-lo com a entrada embora. O nome do arquivo no final, ou <file_name no começo ou no final, ou um pipe será suficiente. Os trabalhos são estes:

  1. Vá para uma linha com data e hora no início e memorize-a.
  2. Vá para uma linha com Average no início e, uma vez lá, imprima a data e a hora memorizadas mais o sinal | e a média obtida da quinta coluna, assumindo a separação da coluna em branco.
  3. Ponto 1. repete.
por 11.11.2018 / 14:15