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))}'
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,
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)}'
Outra maneira:
awk -F'[-,]' '{d=360*($4-$1)+30*($5-$2)+($6-$3);print (d>0)?d:-d}'
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
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
Tags bash text-processing awk