如何使用awk取绝对值?

Eng*_*ng7 19 bash awk text-processing

如果我有以下两个日期:

2015-09-12,2015-08-13
Run Code Online (Sandbox Code Playgroud)

我需要获取它们之间的天数,我将使用以下代码:

awk -F'[-,]' '{print 360*($4-$1)+30*($5-$2)+($6-$3)}'
Run Code Online (Sandbox Code Playgroud)

此代码的输出将是,-29而实际上差异是29

Sté*_*las 35

您可以awk像这样定义函数 :

awk -F'[-,]' '
  function abs(v) {return v < 0 ? -v : v}
  {print abs(360*($4-$1)+30*($5-$2)+($6-$3))}'
Run Code Online (Sandbox Code Playgroud)


jim*_*mij 18

这种情况的常见技巧是使用平方的平方根:

awk -F'[-,]' '{print sqrt((360*($4-$1)+30*($5-$2)+($6-$3))^2)}'
Run Code Online (Sandbox Code Playgroud)

  • 不过有点矫枉过正。请注意,`sqrt(x^2)` 很好,但`sqrt(x)^2` 可能会引入可能导致意外的微小错误。对于busybox `awk`,它需要在启用数学支持的情况下构建(例如,不是Debian 软件包中的默认设置)。 (4认同)
  • sqrt(x)^2 不会因为负数而失败吗? (3认同)

cuo*_*glm 5

其他方式:

awk -F'[-,]' '{d=360*($4-$1)+30*($5-$2)+($6-$3);print (d>0)?d:-d}'
Run Code Online (Sandbox Code Playgroud)