Delta de números em arquivo

4

Em nosso servidor, um cronjob registrou uma contagem de arquivos em um diretório compartilhado. O log é da forma:

2003-07-03T16:05 279
2003-07-03T16:10 283
2003-07-03T16:15 282

Até agora, esse arquivo tem mais de um milhão de entradas. Estou interessado em encontrar as maiores mudanças que já tivemos (negativo e positivo). Eu posso escrever um programa para encontrar isso, mas existe alguma ferramenta que pode me dar uma lista de deltas?

O original está no Solaris, mas eu tenho uma cópia do arquivo no meu sistema Linux Mint.

    
por user90256 04.11.2014 / 17:51

3 respostas

6

Se você tem o pacote num-utils instalado, você pode fazer:

cut -d ' ' -f 2 inputfile | numinterval | sort -u 

O primeiro e o último número lá dão o min, resp. alterações máximas.

Se essa lista for muito longa e você também tiver moreutils instalado, você pode fazer:

cut -d ' ' -f 2 inputfile | numinterval | sort -u | pee "tail -1" "head -1"

No Mint você deve ser capaz de instalar esses pacotes, no Solaris você provavelmente terá que compilar a partir do código-fonte.

    
por 04.11.2014 / 17:59
4
$ awk 'BEGIN{last=0}{delta[NR]=$2-last; last=$2; print $0" "delta[NR]}' file

vai te dar

2003-07-03T16:05 279 279
2003-07-03T16:10 283 4
2003-07-03T16:15 282 -1

com deltas na última coluna, portanto, para encontrar o maior canal, basta classificá-lo

$ awk 'BEGIN{last=0}{delta[NR]=$2-last; last=$2; print $0" "delta[NR]}' file | sort -k3n
2003-07-03T16:15 282 -1
2003-07-03T16:10 283 4
2003-07-03T16:05 279 279

mas para milhões de entradas isso será muito lento. Eu provavelmente usaria mysql ou outro banco de dados.

    
por 04.11.2014 / 18:12
1

Mostra duas linhas com a maior diferença entre

awk '{c=$2-a[2];
      if(c<0)c=-c;
      if(+a[2]&&c>b){b=c;d=a[1]" "a[2]"\n"$0};
      split($0,a," ")}
  END{print "Difference is",b,"between:\n"d}'
    
por 04.11.2014 / 18:50