web-dev-qa-db-ja.com

awkを使用して絶対値を取る方法は?

2つの日付以下の場合:

2015-09-12,2015-08-13

そして、それらの間の日数を取得する必要があります、私は以下のコードを使用します:

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

このコードの出力は-29実際の違いは29

15
Eng7

次のように、awkで関数を定義できます。

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

この種の状況での一般的なトリックは、平方根を使用することです。

awk -F'[-,]' '{print sqrt((360*($4-$1)+30*($5-$2)+($6-$3))^2)}'
12
jimmij

別の方法:

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

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
2
steve

遅くなりましたが、ここにGNU dateコマンドを使用した解決策があります。これは、上記の投稿のすべての回答がそれを考慮した毎月30日の固定に基づいていませんが、 steve's答え

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

以下の入力の場合:

2015-09-12,2015-08-13
2017-02-12,2017-03-12

出力は次のとおりです:

30
28
1
αғsнιη