Câu trả lời:
Bạn có thể định nghĩa các hàm awknhư:
awk -F'[-,]' '
function abs(v) {return v < 0 ? -v : v}
{print abs(360*($4-$1)+30*($5-$2)+($6-$3))}'
Thủ thuật phổ biến cho loại tình huống này là sử dụng căn bậc hai của hình vuông:
awk -F'[-,]' '{print sqrt((360*($4-$1)+30*($5-$2)+($6-$3))^2)}'
sqrt(x^2).
Đến muộn, nhưng đây là một giải pháp sử dụng datelệnh GNU không dựa trên 30 ngày cố định mỗi tháng mà tất cả các câu trả lời được đăng ở trên đều coi đó là câu trả lời của 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
Đối với đầu vào dưới đây:
2015-09-12,2015-08-13
2017-02-12,2017-03-12
Đầu ra là:
30
28
sqrt(x^2)là tốt, nhưngsqrt(x)^2có thể giới thiệu các lỗi nhỏ có thể gây ra sự ngạc nhiên. Đối với busyboxawk, nó cần được xây dựng với tính năng hỗ trợ toán học được bật (không phải mặc định trong các gói Debian).