Réponses:
Vous pouvez définir des fonctions awk
comme:
awk -F'[-,]' '
function abs(v) {return v < 0 ? -v : v}
{print abs(360*($4-$1)+30*($5-$2)+($6-$3))}'
L'astuce courante pour ce genre de situations est d'utiliser la racine carrée du carré:
awk -F'[-,]' '{print sqrt((360*($4-$1)+30*($5-$2)+($6-$3))^2)}'
sqrt(x^2)
.
Trop tard, mais voici une solution utilisant la date
commande GNU qui n'est pas basée sur 30 jours fixes chaque mois que toutes les réponses postées ci-dessus la considéraient comme la réponse 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
Pour l'entrée ci-dessous:
2015-09-12,2015-08-13
2017-02-12,2017-03-12
La sortie est:
30
28
sqrt(x^2)
c'est bien, maissqrt(x)^2
peut introduire de minuscules erreurs qui peuvent provoquer des surprises. Pour busyboxawk
, il doit être construit avec le support mathématique activé (pas la valeur par défaut dans les paquets Debian par exemple).