如果我有以下两个日期:
2015-09-12,2015-08-13
我需要获取它们之间的天数,我将使用以下代码:
awk -F'[-,]' '{print 360*($4-$1)+30*($5-$2)+($6-$3)}'
该代码的输出将是-29
,而实际上的区别是29
答案1
您可以 awk
像这样定义函数:
awk -F'[-,]' '
function abs(v) {return v < 0 ? -v : v}
{print abs(360*($4-$1)+30*($5-$2)+($6-$3))}'
或者:
function abs(v) {v += 0; return v < 0 ? -v : v}
将返回值转换为其负数和正数的规范形式,并且字符串始终转换为数字。如果没有它,abs($0)
输入记录所在的位置1e2
将产生1e2
,而对于-1e2
,它将产生-100
。
答案2
这种情况的常见技巧是使用平方根:
awk -F'[-,]' '{print sqrt((360*($4-$1)+30*($5-$2)+($6-$3))^2)}'
答案3
其他方式:
awk -F'[-,]' '{d=360*($4-$1)+30*($5-$2)+($6-$3);print (d>0)?d:-d}'
答案4
假设您使用的是 GNU awk
,这个时髦的mktime
函数在这里就会派上用场。
awk -F, '{ gsub(/-/," ",$0);a=(mktime($2 " 23 59 59")-mktime($1 " 00 00 00"))/86400;print a*(a<0?-1:1)}' file.txt
29