Jawaban:
Anda dapat mendefinisikan fungsi dalam awkseperti:
awk -F'[-,]' '
function abs(v) {return v < 0 ? -v : v}
{print abs(360*($4-$1)+30*($5-$2)+($6-$3))}'
Trik umum untuk situasi seperti ini adalah menggunakan akar kuadrat dari bujur sangkar:
awk -F'[-,]' '{print sqrt((360*($4-$1)+30*($5-$2)+($6-$3))^2)}'
sqrt(x^2).
Untuk terlambat, tapi di sini ada solusi menggunakan dateperintah GNU yang tidak didasarkan pada 30 hari tetap setiap bulan bahwa semua jawaban yang diposting di atas menganggapnya tetapi jawaban 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
Untuk input di bawah ini:
2015-09-12,2015-08-13
2017-02-12,2017-03-12
Outputnya adalah:
30
28
sqrt(x^2)baik-baik saja, tetapisqrt(x)^2dapat memperkenalkan kesalahan kecil yang dapat menyebabkan kejutan. Untuk busyboxawk, itu harus dibangun dengan dukungan matematika diaktifkan (bukan default dalam paket Debian misalnya).