awk를 사용하여 절대 가치를 얻는 방법?


14

두 날짜 미만인 경우 :

2015-09-12,2015-08-13

그리고 그들 사이의 일수를 가져와야합니다. 아래 코드를 사용합니다.

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

이 코드의 출력은 -29실제로 차이는 있지만29

답변:


23

다음 awk과 같은 기능을 정의 할 수 있습니다 .

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

11

이러한 상황에 대한 일반적인 트릭은 제곱근을 사용하는 것입니다.

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

3
그래도 약간 과잉입니다. 그 주 sqrt(x^2)괜찮지 만 sqrt(x)^2놀라움을 일으킬 수 있습니다 작은 오류가 발생할 수 있습니다. busybox의 awk경우 수학 지원이 활성화 된 상태로 빌드해야합니다 (예 : 데비안 패키지의 기본값이 아님).
Stéphane Chazelas

3
sqrt (x) ^ 2가 단순히 음수로 실패하지 않습니까?
Daniel McLaury

1
@DanielMcLaury 그래서 그렇습니다 sqrt(x^2).
jimmij

@ jimmij : 답변 자체가 아닌 답변에 대한 의견에 회신하고 있습니다.
Daniel McLaury

3

또 다른 방법:

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

이것은 아마도 가장 효율적인 (성능) 답변입니다.
Hastur

2

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

1

늦었지만, 여기에 date게시 된 모든 답변이 그것을 고려한 steve의 답변으로 매달 고정 된 30 일을 기반으로하는 GNU 명령을 사용하는 솔루션 이 있습니다.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.