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

관련 정보