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

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

다음과 같은 날짜/시간 형식의 파이프로 구분된 파일이 있습니다 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]

답변2

strftime비슷한 접근 방식을 사용하려면 다음을 고려해 볼 수 있습니다.밀러, 해당 strptimeex도 제공합니다.

$ mlr --nidx --fs '|' put -S '
    $4 = strftime(strptime($4,"%Y%m%d%H%M%S"),"%Y-%m-%d %H:%M:%S")
  ' file
John|Doe|TEST|2021-07-28 12:08:21
John|Davis|TEST|2021-08-28 12:08:21
John|Smith|TEST|2021-05-28 12:08:21

답변3

가정: 변경할 필드는 정확히 14자리 숫자를 포함하는 유일한 또는 첫 번째 필드입니다.

sed -E 's=\|([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})\|=|\1-\2-\3 \4:\5:\6|='

$4필요하기 때문에 시도가 실패했습니다 .UNIX 시대 시간(1970년 이후의 시간(초)), 처럼GNU Awk 매뉴얼문서.

답변4

몇 가지 답변을 작성했지만 이를 스크립팅에 사용하는 방법 ex에 대한 답변을 찾을 수 없습니다 . ex어쨌든 이것은 miller와 같은 도구를 설치할 필요가 없는 상당히 이식 가능한 대안입니다.

이것을 넣어script.vim

global/|/normal! 03f|lct|^R=strftime('%Y-%m-%d %H:%M:%S', strptime('%Y%m%d%H%M%S', @"))^M
wq

그런 다음 ex -S script.vim input-file. (변경 사항이 적용되었습니다. 마음에 들지 않으면 로 조정하거나 및 를 사용하여 wq"표준 출력으로 인쇄"와 같은 것을 얻으십시오.)saveas filequit!%printquit!

리터럴 control-R과 control-M 또는 캐리지 리턴을 ^R합산 합니다 (vim에서 예: - - ).^MCtrlV CtrlR

관련 정보