awk를 사용하여 열에서 날짜를 빼는 방법은 무엇입니까?

awk를 사용하여 열에서 날짜를 빼는 방법은 무엇입니까?

다음과 같은 세 개의 열이 있습니다.

18:37:12 18:37:31 0  
18:37:01 18:37:18 0

다음과 같이 첫 번째 두 열의 초 차이로 세 번째 열을 채우고 싶습니다.

18:37:12 18:37:31 19  
18:37:01 18:37:18 17

나는 이것을 사용하고 있습니다 :

nova migration-list | grep completed | awk '{ print substr($22,12,8), substr($24,12,8) }' | awk 'BEGIN{ FS=" " } { print $0, $2-$1 }'

도움을 주셔서 감사합니다.

답변1

GNU 시스템에서:

awk '{"date -d "$1" +%s"|getline one; "date -d "$2" +%s"|getline two; \
         print $1, $2, two-one}' file.txt
  • "date -d "$1" +%s"|getline one필드 1에 대해 에포크(GNU 사용) 이후 초를 가져오고 date변수에 저장합니다.one

  • "date -d "$2" +%s"|getline two필드 2에 대해서도 동일한 작업을 수행하고 결과를 변수로 저장합니다.two

  • print $1, $2, two-one필드 1, 2 및 변수 2와 1의 빼기를 인쇄합니다.

예:

% cat file.txt
18:37:12 18:37:31 0
18:37:01 18:37:18 0

% awk '{"date -d "$1" +%s"|getline one; "date -d "$2" +%s"|getline two; print $1, $2, two-one}' file.txt
18:37:12 18:37:31 19
18:37:01 18:37:18 17

답변2

GNU awk의 내장 시간 함수 사용:

awk '
  function to_time(time,   t,a) {
    split(time, a, ":")
    t = mktime("1970 1 1 " a[1] " " a[2] " " a[3])
    return t
  }
  {print $1, $2, to_time($2) - to_time($1)}
' file

관련 정보