Jawaban:
Anda dapat mendefinisikan fungsi dalam awk
seperti:
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 date
perintah 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)^2
dapat memperkenalkan kesalahan kecil yang dapat menyebabkan kejutan. Untuk busyboxawk
, itu harus dibangun dengan dukungan matematika diaktifkan (bukan default dalam paket Debian misalnya).