Ответы:
Вы можете определить функции awk
как:
awk -F'[-,]' '
function abs(v) {return v < 0 ? -v : v}
{print abs(360*($4-$1)+30*($5-$2)+($6-$3))}'
Обычная хитрость для таких ситуаций - использование квадратного корня из квадрата:
awk -F'[-,]' '{print sqrt((360*($4-$1)+30*($5-$2)+($6-$3))^2)}'
sqrt(x^2)
.
В последнее время, но вот решение, использующее date
команду GNU, которое не основано на фиксированных 30 днях каждый месяц, чтобы все ответы, опубликованные выше, рассматривали его, но ответ Стива .
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
Для ввода ниже:
2015-09-12,2015-08-13
2017-02-12,2017-03-12
Выход:
30
28
sqrt(x^2)
это хорошо, ноsqrt(x)^2
может привести к небольшим ошибкам, которые могут вызвать сюрпризы. Для busyboxawk
его необходимо собрать с включенной поддержкой математики (например, не в пакетах Debian).