구분 기호 인덱스를 가져오고 EPOCH 시간을 변환합니다.

구분 기호 인덱스를 가져오고 EPOCH 시간을 변환합니다.

첫 번째 행에서 시간을 검색하고 위치 인덱스를 가져온 다음 다른 행의 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) 를 통해

관련 정보