Como obter o valor absoluto usando o awk?

10

Se eu tiver abaixo de duas datas:

2015-09-12,2015-08-13

E eu preciso ter o número de dias entre eles, vou usar o código abaixo:

awk -F'[-,]' '{print 360*($4-$1)+30*($5-$2)+($6-$3)}'

A saída desse código será -29 , enquanto a diferença é 29

Por favor avise,

    
por Eng7 06.08.2015 / 18:35

5 respostas

20

Você pode definir funções em awk como:

awk -F'[-,]' '
  function abs(v) {return v < 0 ? -v : v}
  {print abs(360*($4-$1)+30*($5-$2)+($6-$3))}'
    
por 06.08.2015 / 18:38
10

O truque comum para esse tipo de situação é usar a raiz quadrada do quadrado:

awk -F'[-,]' '{print sqrt((360*($4-$1)+30*($5-$2)+($6-$3))^2)}'
    
por 06.08.2015 / 18:53
2

Outra maneira:

awk -F'[-,]' '{d=360*($4-$1)+30*($5-$2)+($6-$3);print (d>0)?d:-d}'
    
por 06.08.2015 / 18:41
2

Supondo que você esteja no GNU awk , a função funky mktime é útil aqui.

awk -F, '{ gsub(/-/," ",$0);a=(mktime($2 " 23 59 59")-mktime($1 " 00 00 00"))/86400;print a*(a<0?-1:1)}' file.txt
29
    
por 06.08.2015 / 18:54
0

Até tarde, mas aqui está uma solução usando o comando GNU date que não é baseado em 30 dias fixos a cada mês que todas as respostas postadas acima o consideravam, mas resposta de Steve .

awk -F, '{cmd="printf \"%d\n\" $((($(date -d"$1" +%s)-$(date -d"$2" +%s))/86400))"; 
    cmd|getline $0; $0*=($0<0?-1:1); close(cmd)}1' infile

Para a entrada abaixo:

2015-09-12,2015-08-13
2017-02-12,2017-03-12

A saída é:

30
28
    
por 21.10.2017 / 20:06