Odpowiedzi:
Możesz zdefiniować funkcje w awk
:
awk -F'[-,]' '
function abs(v) {return v < 0 ? -v : v}
{print abs(360*($4-$1)+30*($5-$2)+($6-$3))}'
Typową sztuczką w tego rodzaju sytuacjach jest użycie pierwiastka kwadratowego z kwadratu:
awk -F'[-,]' '{print sqrt((360*($4-$1)+30*($5-$2)+($6-$3))^2)}'
sqrt(x^2)
.
Do późna, ale oto rozwiązanie wykorzystujące date
polecenie GNU, które nie opiera się na ustalonych 30 dniach każdego miesiąca, że wszystkie powyższe odpowiedzi uważały to, ale odpowiedź Steve'a .
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
Dla poniższych danych wejściowych:
2015-09-12,2015-08-13
2017-02-12,2017-03-12
Dane wyjściowe to:
30
28
sqrt(x^2)
jest w porządku, alesqrt(x)^2
może wprowadzać drobne błędy, które mogą powodować niespodzianki. W przypadku busyboksaawk
należy go zbudować z włączoną obsługą matematyczną (na przykład nie domyślną w pakietach Debiana).