bash script2023. 7. 27. 10:43

 

반달가면 이글루에서 백업 - http://bahndal.egloos.com/593115

시간을 타임스탬프, 또는 유닉스 시간(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 명령으로 파일의 내용을 한줄씩 읽어서 작업하는 것보다는 빠를 것이다.

728x90
Posted by 반달가면