에포크 시간을 가져와 새 열로 추가

에포크 시간을 가져와 새 열로 추가

UTC 타임스탬프가 포함된 탭으로 구분된 다음 입력 파일이 있습니다. 신기원 시간을 계산하고 새 열로 추가하는 방법은 무엇입니까? 이 파일은 60MM 이상의 라인을 포함하는 대용량 파일입니다.

a   b
0   2020-03-03 15:46:52
1   2020-03-02 11:05:17

산출:

a   b                   c  
0   2020-03-03 15:46:52 1583279212
1   2020-03-02 11:05:17 1583175917

답변1

GNU를 사용 awk하고MK 시간:

awk '
  BEGIN{ FS=OFS="\t" }
  FNR==1{ print $0, "c"; next }
  {
    split($2, a, /[ :-]/)
    print $0, mktime(a[1]" "a[2]" "a[3]" "a[4]" "a[5]" "a[6], 1)
  }
' file
  • 탭 문자를 입력 및 출력 필드 구분 기호로 사용
  • c제목 행에 추가
  • a:공백 문자를 구분 기호 로 사용하여 두 번째 필드를 배열로 분할 -하고 UTC 플래그를 사용하여 타임스탬프를 인쇄합니다.

산출:

a       b       c
0       2020-03-03 15:46:52     1583250412
1       2020-03-02 11:05:17     1583147117

답변2

대용량 파일에 얼마나 적합한지는 잘 모르겠지만, 이것을 시도해 보세요밀러

$ TZ=UTC mlr --pprint --fs tab put -S '$c = strftime(strptime($b,"%Y-%m-%d %H:%M:%S"),"%s")' file
a   b                                   c
0   2020-03-03 15:46:52 1583250412
1   2020-03-02 11:05:17 1583147117

(OFS가 탭일 때 제목 정렬이 엉망인 것 같습니다...).

답변3

프로세스 대체를 지원하는 다른 쉘 date에서 GNU 사용 :bash

$ paste file <( echo c; date -u -f <( cut -f 2 file | sed 1d ) +%s )
a       b       c
0       2020-03-03 15:46:52     1583250412
1       2020-03-02 11:05:17     1583147117

가장 안쪽 프로세스는 <( cut -f 2 file | sed 1d )원본 데이터를 생성한 두 번째 열(타임스탬프)을 대체하고 헤더를 제거합니다. 이러한 타임스탬프는 date프로세스 대체 옵션을 통해 GNU에 입력되고 -f출력 형식 문자열을 사용하여 Unix 초로 변환됩니다 %s. GNU에는 현지 시간 대신 UTC 시간을 인쇄 -u하는 옵션이 있습니다 .date

외부 프로세스는 <( echo c; date ... )새 출력 열의 헤더를 바꾼 다음 해당 열에 대한 데이터를 생성합니다.

그런 다음 붙여넣기를 기존 데이터의 새 열로 사용하십시오 paste.

관련 정보