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
.