processando múltiplas linhas de janela deslizante

3

O título é uma generalização do que eu quero. Problema específico: dado algum comando que gera vários timestamps, por exemplo:

$ cat timestamps | sort -n
1508349271820
1508349271821
1508349425222
1508349425223
1508349454218
1508349476419
1508349500018
1508349500020
1508349698820
1508349698822
1508350047721
1508350047724
1508351635621
1508351635623
1508351699618
1508351699620
1508351699621
1508351699622
1508351699623
1508352230120
1508352230123
1508352230124
1508352230125
1508352232219
1508352232220
1508352364919
1508352364920
1508352387618
1508352387619

Eu quero calcular cada 2 diff. Eu acabei fazendo algo como:

$ wc -l timestamps
29

cat <(sort -n timestamps | head -28) <(sort -n timestamps | tail -28) | sort -n | xargs -n 2 sh 'calc $2 - $1' sh
1
153401
1
28995
22201
23599
2
198800
2
348899
3
1587897
2
63995
2
1
1
1
530497
3
1
1
2094
1
132699
1
22698
1

Então eu consegui sobreviver, mas deve haver um jeito mais fácil. A generalização é: dada uma saída com várias linhas, como posso calcular uma janela deslizante de x args de uma vez, com y args tamanho do passo?

    
por gilad hoch 07.03.2018 / 06:17

2 respostas

7

Awk é bem adequado para isso:

awk 'NR>1{print $1-last} {last=$1}' timestamps

Acima, para cada linha após a primeira ( NR>1 ), imprimimos o valor no valor atual, $1 , menos o valor na linha anterior, last . Em seguida, atualizamos o valor de last .

Exemplo

$ awk 'NR>1{print $1-last} {last=$1}' timestamps
1
153401
1
28995
22201
23599
2
198800
2
348899
3
1587897
2
63995
2
1
1
1
530497
3
1
1
2094
1
132699
1
22698
1

Cálculo mais complexo

O código abaixo começa com o número na linha atual, adiciona o dobro do número na linha anterior e subtrai três vezes o número na linha das cinco linhas anteriores:

awk '{a[NR]=$1} NR>5{print a[NR]+2*a[NR-1]-3*a[NR-5]}' timestamps
    
por 07.03.2018 / 06:31
5

Instale os num-utils , depois canalize o arquivo ou os dados para numinterval :

sort -n timestamps | numinterval
    
por 07.03.2018 / 07:02

Tags