awkを使用して絶対値を取得するには?

awkを使用して絶対値を取得するには?

次の2つの日付がある場合:

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

関連情報