첫 번째 행에서 시간을 검색하고 위치 인덱스를 가져온 다음 다른 행의 EPOCH 시간을 사람이 읽을 수 있는 시간으로 변환해야 합니다. EPOCH 시간 위치는 무작위이지만 헤더가 있습니다. 예는 다음과 같습니다.
Name,city,time
ABC,New York,1667271686096
CDF,Palo Alto,1667271685202
답변1
입력이 CSV라고 가정하면 다음을 사용하십시오.밀러( mlr
) 필드의 값을 time
(필드에 나타나는 순서에 관계없이) Unix 시간에서 현재 로케일의 현지 시간 표현으로 변환합니다.
$ mlr --csv put '$time = strftime_local($time,"%+")' file
Name,city,time
ABC,New York,Sat Sep 27 01:54:56 CEST 54803
CDF,Palo Alto,Sat Sep 27 01:40:02 CEST 54803
$ TZ=Canada/Central mlr --csv put '$time = strftime_local($time,"%+")' file
Name,city,time
ABC,New York,Fri Sep 26 18:54:56 CDT 54803
CDF,Palo Alto,Fri Sep 26 18:40:02 CDT 54803
UTC 시간의 경우 strftime()
다음을 대신 사용하세요 strftime_local()
.
$ mlr --csv put '$time = strftime($time,"%+")' file
Name,city,time
ABC,New York,Fri Sep 26 23:54:56 UTC 54803
CDF,Palo Alto,Fri Sep 26 23:40:02 UTC 54803
다른 시간 형식의 경우 또는 함수에 보다 구체적인 시간 형식 문자열을 제공합니다 strftime()
(시스템 설명서 참조 strftime_local()
).strftime
$ mlr --csv put '$time = strftime_local($time,"At the hour %H of day %j of the year %Y")' file
Name,city,time
ABC,New York,At the hour 01 of day 270 of the year 54803
CDF,Palo Alto,At the hour 01 of day 270 of the year 54803
sec2gmt()
Miller 버전 및 시스템에 따라 항상 보다 구체적인 시간 형식 문자열을 사용하거나 사용하기 더 쉬운 기능 으로 전환할 수 있습니다 sec2localtime()
.
$ mlr --csv put '$time = sec2gmt($time)' file
Name,city,time
ABC,New York,54803-09-26T23:54:56Z
CDF,Palo Alto,54803-09-26T23:40:02Z
$ TZ=Europe/Stockholm mlr --csv put '$time = sec2localtime($time)' file
Name,city,time
ABC,New York,54803-09-27 01:54:56
CDF,Palo Alto,54803-09-27 01:40:02
$ TZ=Canada/Central mlr --csv put '$time = sec2localtime($time)' file
Name,city,time
ABC,New York,54803-09-26 18:54:56
CDF,Palo Alto,54803-09-26 18:40:02
답변2
Perl의 경우 다음을 사용하십시오.목록::추가 유틸리티first_index
"time"을 포함하는 첫 번째 필드의 인덱스 번호를 찾는 함수 모듈날짜 형식기능 의 경우 time2str()
:
$ perl -MList::MoreUtils=first_index -MDate::Format -F, -lne '
if ($.==1) {
$tfield = first_index { m/time/i }, @F ;
} else {
$F[$tfield] = time2str("%Y-%m-%d %H:%M:%S",$F[$tfield])
};
print join(",",@F)' file.csv
Name,city,time
ABC,New York,54803-09-27 09:54:56
CDF,Palo Alto,54803-09-27 09:40:02
참고: Perl의 Date::Format
모듈은 다음보다 큰 타임스탬프에는 문제가 없습니다.2038년 1월 19일 03:14:07, 일반적으로 Perl은 그렇지 않습니다. 왜냐하면진주 v5.12(2010년 4월 출판). 다른 언어는 언어 및/또는 운영 체제가 여전히 시간 값에 32비트 부호 있는 정수를 사용하는지 여부에 따라 정확하게 작동할 수도 있고 작동하지 않을 수도 있습니다(Linux는 모든 아키텍처, 심지어 32비트에서도 64비트 time_t로 전환함). 것, v5.1 버전). 2020년에는 6개).
또한 사용된 두 모듈 모두 Perl의 표준으로 포함되어 있지 않습니다. 당신은 그들을 설치해야팬또는 배포용으로 패키지된 경우 배포판의 패키지 관리자(예: Debian 및 파생 상품 sudo apt-get install libtimedate-perl liblist-moreutils-perl
) 를 통해