csv 테이블의 날짜를 Unix 타임스탬프로 다시 포맷합니다.

csv 테이블의 날짜를 Unix 타임스탬프로 다시 포맷합니다.

첫 번째 열의 .csv형식으로 날짜와 시간이 포함된 파일이 있습니다 . 01/20/2016 23:53:01내 열은 세미콜론으로 구분됩니다. 즉,

01/21/2016 03:03:01;18616;0;1
01/21/2016 03:13:01;29040;36553;2

~에그래서bash 명령을 찾았습니다

date -d '06/12/2012 07:21:22' +"%s" 

내가 원하는 것에 작동합니다. 이제 awk첫 번째 열을 교체하기 위해 통합을 시도했습니다 . 나는 찾았다비슷한 문제에 대한 답변:

awk -F'"' -v OFS='"'  '$8 {cmd="date -d \""$8"\" +%FT%T%z"; cmd | getline $8; close(cmd)} 1' input.json

나는 내 자신의 입력에 적응하려고 노력했습니다. 그러나 나는 빈 결과를 얻었습니다.

답변1

질문을 작성하는 동안 마침내 고무 오리가 생겼습니다. 내 해결책은 다음과 같습니다.

awk -F';' -v OFS=';'  '$1 {cmd="date -d \""$1"\" +%s"; cmd | getline $1; close(cmd)} 1' datetime.csv > unix.csv

그것은 두 가지의 조합이었습니다. 켜기가 누락되었고 "입력 +%s"에 끊어진 줄이 있었습니다.

답변2

GNU 날짜에는 -f파일에서 읽은 날짜를 한 줄씩 변환하는 옵션이 있습니다. 파일이 길면 date한 줄에 한 번 호출하는 것보다 빠릅니다. 날짜는 라인에 단독으로 표시되어야 합니다. 따라서 계획은 첫 번째 열( cut -d \; -f 1)을 분리하고 이를 실행하여 date -f -변환을 수행하는 것입니다.반죽나머지 열의 결과입니다.

paste -d \; <(<input cut -d \; -f 1 | date -f - +%s) <(<input cut -d \; -f 2-)

이는 쉘이 지원한다고 가정합니다.프로세스 대체(ksh93, bash, zsh). plain 을 사용하면 (대부분 sh지원) Unix 변형에서 /dev/fd파일 설명자 섞기를 사용할 수 있습니다.

<input cut -d \; -f 2- | {
  exec 3<&0
  <input cut -d \; -f 1 | date -f - +%s | paste -d \; - /dev/fd/3
}

답변3

흠. 좋아, 이것은 얼마 전 일이지만 제안을 던지는 것이 좋을 것 같습니다.

나는 파일의 모든 줄에 대해 "date"를 호출하기 위해 셸을 실행하는 것이 줄이 많으면 약간 느릴 수 있다고 확신합니다.

저는 작업표 항목을 처리하고 Google 캘린더에서 추출한 다음 일부 HTML을 출력하여 PDF 송장으로 변환하기 위해 작성한 스크립트를 작성하려고 했습니다. 그런데 그 얘기를 하다 보니 너무 길어졌습니다. 그래서 나는 여러분에게 독서 시간을 절약할 수 있는 코드를 제공할 것입니다.

저는 AWK 함수 gensub 및 mktime [https://www.gnu.org/software/gawk/manual/html_node/Time-Functions.html]을 사용하고 있습니다. mktime 함수는 datespec 형식 "YYYY MM DD HH MM SS [DST]"의 입력을 기대하므로 입력은 gensub 함수가 들어오는 위치로 이동해야 합니다. 여기에 내가 당신을 위해 얻은 것이 있습니다...

awk -F';' -v OFS=';' '{ $1=mktime(gensub(/(..)\/(..)\/(....) (..):(..):(..)/, "\\3 \\1 \\2 \\4 \\5 \\6", 1, $1)); } 1' datetime.csv > unix.csv

나는 이것을 약간 다르게 수행하고 첫 번째 인수에 다시 쓰는 대신 인쇄로 개별 인수를 출력할 것입니다. 조금 더 자기 문서화 ;) 팀토우디

awk -F';' -v OFS=';' '{ print mktime(gensub(/(..)\/(..)\/(....) (..):(..):(..)/, "\\3 \\1 \\2 \\4 \\5 \\6", 1, $1)), $2, $3, $4; }' datetime.csv > unix.csv

스크립트가 조금 더 장황하다는 것을 알고 있지만 성능이 더 좋기를 바랍니다.

당신이나 다른 사람이 같은 것을 보는 데 도움이되기를 바랍니다.

관련 정보