[bash: awk] 일반 시간을 타임스탬프(timestamp)로 변환하기 (mktime) 리눅스 bash script

시간을 타임스탬프, 또는 유닉스 시간(unix time)으로 변환하고 싶을 경우 아래의 예시와 같이 date 명령으로 간편하게 바꿀 수 있다. (참고로, 유닉스 시간은 UTC 1970년 1월 1일 0시부터 몇초가 경과했는지를 나타낸다)

# 2017년 1월 1일 9시 10분 25초를 유닉스 시간으로 (date)
date -d "2017/1/1 09:10:25" "+%s"
1483229425

awk에서도 동일한 작업을 할 수 있다.

# 2017년 1월 1일 9시 10분 25초를 유닉스 시간으로 (awk)
echo "2017/1/1 09:10:25" | awk '{ date_arg=gensub("[/:]/," ","g",$0); print mktime(date_arg);}'
1483229425

굳이 date를 놔두고 awk를 사용할 필요가 있는가 싶기도 하지만, 문제는 이런 종류의 정보가 대량으로 들어가 있는 커다란 파일 안에 있는 것들을 전부 변환해야 하는 상황에서 생긴다. 한줄씩 읽어서 일일이 date 명령으로 변환해 주는 것보다 awk에서 해당 파일을 열어서 변환하는 것이 더 효율적이다.

위의 예시에 대해 간략히 설명하자면, 입력 받은 값에서 슬래시(/)와 콜론(:)을 공백으로 바꾸기 위해 gensub 함수를 이용해서 문자열을 대체하고, 그 결과를 date_arg 변수에 할당했다(gensub 함수에 대한 내용은 이전 게시물을 참고하자. 여기로). 이렇게 하는 이유는 그 다음에 실제로 시간 변환을 하는 mktime 함수의 입력 형식이 "연 월 일 시 분 초"이기 때문이다. 즉, 위의 예시에서 mktime에 들어가는 인자는 "2017 1 1 09 10 25" 이렇게 되어야 한다. 이제 mktime 함수에 date_arg 변수를 인자로 넣어서 해당 결과값을 출력(print)하면 된다.  

시간 형식이 위와 다르다면 mktime에 사용 가능한 형태로 바꾸기 위해 문자열 작업을 더 해야 할 수도 있는데, 그래도 대부분의 경우 date 명령으로 파일의 내용을 한줄씩 읽어서 작업하는 것보다는 빠를 것이다.



덧글

  • 2019/09/11 20:27 # 삭제 답글 비공개

    비공개 덧글입니다.
  • 반달가면 2019/09/16 21:57 #

    날짜 표시 형식을 바꾸는 문제는 awk 자체적으로 가능한지 모르겠네요. date 명령을 이용해야 될 것 같습니다. 아래의 게시물을 참고해 보시기 바랍니다.

    [bash: awk] awk에서 외부 명령을 실행하고 결과를 변수에 저장하기
    http://bahndal.egloos.com/591077

    date 명령은 -d 옵션을 이용하면 될 듯합니다.

    date -d "Aug 31 2018" "+%Y-%m-%d T %H:%M:%S"
댓글 입력 영역
* 비로그인 덧글의 IP 전체보기를 설정한 이글루입니다.

Google Analytics


B-Side


adsense(w160_h600)2

통계 위젯 (화이트)

1431045
3392
1828171

ad_widget_2