유닉스 명령에서 시대를 사람이 읽을 수 있는 날짜로 변환하고 일반 날짜로 변환합니다.

유닉스 명령에서 시대를 사람이 읽을 수 있는 날짜로 변환하고 일반 날짜로 변환합니다.

다음 데이터가 포함된 파일이 있는데 첫 번째 필드 값을 날짜로 변환하려고 하는데 두 번째 필드가 누락되었습니다.

cat memoey-total.csv
1700561388,277126765312
1700561647,277126765312
1700561811,277126765312
1700562945,277126765312
1700563689,277126765312

awk '{$1 = strftime("%Y%m%d%H%M%S", substr($1,1,10))} 1' memoey-total.csv

20231121100948
20231121101407
20231121101651
20231121103545
20231121104809
20231121110003
20231121111003
20231121112003

원하는 형식으로 변환할 수 있지만 출력에서 ​​두 번째 필드를 얻으려면 어떻게 해야 합니까?

답변1

strftime입력 및 출력에 대한 필드 구분 기호로 쉼표를 사용하도록 AWK(기술적으로 Gawk, 사용 중이므로)에 지시해야 합니다 .

$ awk 'BEGIN { OFS = FS = "," } {$1 = strftime("%Y%m%d%H%M%S", substr($1,1,10))} 1' memoey-total.csv
20231121110948,277126765312
20231121111407,277126765312
20231121111651,277126765312
20231121113545,277126765312
20231121114809,277126765312

그리고고크 5.3.0 이상, 당신은 그것을 사용할 수 있습니다CSV 모드( --csv) 대신 (최신 버전에서도 사용 가능)진짜 어이없네, 그러나 후자는 아님 strftime).

답변2

그리고 perl:

perl -MPOSIX -pe 's/\d+/strftime("%Y%m%d%H%M%S", localtime($&))/e'

첫 번째 숫자 시퀀스를 해당 현지 시간(YYYYmmddHHMMSS 형식)으로 변환합니다.

현지 시간 대신 UTC 시간을 원할 경우 명령을 바꾸거나 해당 명령의 접두사를 붙입니다 localtime .gmtimeTZ=UTC0


¹ 이 형식은 시간대 오프셋을 지정하지 않으므로 DST가 수행되는 시간대에서는 모호합니다. 두 개의 서로 다른 에포크 시간이 동일한 타임스탬프를 제공할 수 있기 때문입니다. 예를 들어, 및 둘 다 1698539456유럽/런던 시간대에서 1698543056동일한 타임스탬프를 생성합니다.20231029013056

관련 정보