如何使用awk取绝对值?

如何使用awk取绝对值?

如果我有以下两个日期:

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

相关内容