csv 파일의 두 번째 열을 Unix 시간에서 읽을 수 있는 날짜/시간으로 변환하는 Bash 스크립트

csv 파일의 두 번째 열을 Unix 시간에서 읽을 수 있는 날짜/시간으로 변환하는 Bash 스크립트

내 입력 파일은 쉼표로 구분된 .csv입니다. 두 번째 열을 유닉스 시간에서 아래와 같이 읽을 수 있는 날짜/시간 형식으로 변환하고 싶습니다.

before   1502280000
after    8/10/17 08:00:00

또한 제목이기 때문에 첫 번째 줄을 무시하고 싶습니다.

저는 Solaris 10의 bash 쉘에서 실행 중입니다.

내 CSV의 처음 두 행은 다음과 같습니다.

HOST,DATE_TIME_CREATED,USER_ID,EVENT_CLASS
xxxx,1502286180,xxxx,xxxx
xxxx,1502280347,xxxx,xxxx

출력을 찾고

HOST,DATE_TIME_CREATED,USER_ID,EVENT_CLASS
xxxx,Wed Aug  9 09:43:00 EDT 2017,xxxx,xxxx
xxxx,Wed Aug  9 08:05:47 EDT 2017,xxxx,xxxx

답변1

저는 YYYY-mm-dd HH:MM:SS 시간 형식을 적극 권장합니다. 이 형식은 명확하고 어휘 및 시간순으로 정렬됩니다.

이를 달성하기 위해 Perl을 사용할 수 있습니다.

perl -MPOSIX=strftime -F, -ane '
    $F[1] = strftime("%F %T", localtime $F[1]) if $. > 1; 
    print join ",", @F
' file

답변2

awk방법:

awk -F, 'NR>1{printf"%s,",$1;
             system("printf \"$(date -d @"$2")\"");printf",%s,%s\n",$3,$4}
' infile.txt
HOST,DATE_TIME_CREATED,USER_ID,EVENT_CLASS
xxxx,Wed Aug  9 09:43:00 EDT 2017,xxxx,xxxx
xxxx,Wed Aug  9 08:05:47 EDT 2017,xxxx,xxxx

답변3

Miller( mlr)를 사용하여 Unix 타임스탬프 형식을 지정합니다 strftime_local(). 생성된 시간+날짜는 현지 시간대입니다.

$ mlr --csv put '$DATE_TIME_CREATED = strftime_local($DATE_TIME_CREATED,"%c")' file
HOST,DATE_TIME_CREATED,USER_ID,EVENT_CLASS
xxxx,Wed Aug  9 13:43:00 2017,xxxx,xxxx
xxxx,Wed Aug  9 12:05:47 2017,xxxx,xxxx

strftime(3)사용할 수 있는 형식 문자열은 시스템 설명서를 참조하세요 . %c"국가별 시간 및 날짜 표현으로 대체" 형식입니다.

관련 정보