파이프로 구분된 파일의 타임스탬프 재형식 지정

파이프로 구분된 파일의 타임스탬프 재형식 지정

다음과 같은 날짜/시간 형식의 파이프로 구분된 파일이 있습니다 yyyymmddhhmmss.

John|Doe|TEST|20210728120821|[email protected]
John|Davis|TEST|20210828120821|[email protected]
John|Smith|TEST|20210528120821|[email protected]

yyyy-mm-dd hh:mm:ss4열의 문자열을 이렇게 변환하려고 합니다.

John|Doe|TEST|2021-07-28 12:08:21|[email protected]
John|Davis|TEST|2021-08-28 12:08:21|[email protected]
John|Smith|TEST|2021-05-28 12:08:21|[email protected]

Linux에서 텍스트 처리를 처음 접했기 때문에 awk다음과 같은 것을 검색하고 사용해 보았습니다.

awk -F"|" '{OFS="|"; $4=strftime("%Y-%m-%d %H:%M:%S", $4); print $0}'

하지만 예상대로 변환되지 않습니다.

ベストアンサー1

이러한 "타임스탬프"는 epoch 이후의 초 단위가 아니며 strftime()연도, 월 등 구분 기호가 없는 날짜+시간일 뿐입니다. 시간 함수를 사용하는 대신 간단한 텍스트 조작만 하면 됩니다.

gensub()를 실행하려면 (이미 사용하고 있는) GNU awk를 사용하십시오.

$ awk 'BEGIN{FS=OFS="|"} {$4=gensub(/(.{4})(..)(..)(..)(..)(..)/,"\\1-\\2-\\3 \\4:\\5:\\6",1,$4)} 1' file
John|Doe|TEST|2021-07-28 12:08:21|[email protected]
John|Davis|TEST|2021-08-28 12:08:21|[email protected]
John|Smith|TEST|2021-05-28 12:08:21|[email protected]

또는 awk를 사용하십시오.

$ awk 'BEGIN{FS=OFS="|"} {$4=sprintf("%s-%s-%s %s:%s:%s", substr($4,1,4), substr($4,5,2), substr($4,7,2), substr($4,9,2), substr($4,11,2), substr($4,13,2))} 1' file
John|Doe|TEST|2021-07-28 12:08:21|[email protected]
John|Davis|TEST|2021-08-28 12:08:21|[email protected]
John|Smith|TEST|2021-05-28 12:08:21|[email protected]

おすすめ記事