태그 보관물: text-processing

text-processing

awk를 사용하여 절대 가치를 얻는 방법? 코드를 사용합니다. awk -F'[-,]’ ‘{print 360*($4-$1)+30*($5-$2)+($6-$3)}’ 이 코드의

두 날짜 미만인 경우 :

2015-09-12,2015-08-13

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

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

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



답변

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

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

답변

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

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

답변

또 다른 방법:

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

답변

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

답변

늦었지만, 여기에 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

답변