AWK/GAWK를 사용하여 타임스탬프 필드 형식을 지정하는 방법

AWK/GAWK를 사용하여 타임스탬프 필드 형식을 지정하는 방법

저는 GAWK를 사용하여 "18-APR-22 11:00:00"과 같은 타임스탬프 형식의 필드가 있는 CSV 파일을 처리하고 있습니다. awk "2022-04-18 11:00:00" 출력에서 ​​날짜 형식을 지정하고 싶습니다. 나는 "date -d"와 getline을 사용하여 이 작업을 수행했습니다. 다음 예에 표시된 대로입니다.

awk -v FS="," -v OFS="," '
{
  tmp = "date -d \""$1"\" +\"%F %T\""
  tmp | getline var
  close(tmp)
}
{split(FILENAME, arr, ".")}
{print NR, arr[1], tmp, $4, $7, $8, $9}
' 13003.ARR > test.csv

이것이 작동하는 동안 대용량 파일의 경우 속도가 매우 느립니다. 타임스탬프 필드를 가져오고 해당 형식을 변경하는 더 좋은 방법이 있습니까?

답변1

고마워요, 타나십님. 귀하의 의견이 정확합니다. 나는 지금 다음을 사용하고 있으며 수천 배 더 빠릅니다. 240,000개의 레코드가 포함된 csv를 실행하는 데는 단 3초밖에 걸리지 않습니다.

awk -v FS="," -v OFS="," '{
  split(FILENAME, fname, ".")
  split($1, date_time, " ")
  split(date_time[1], date, "-")
  print NR, name[1], "20" date[3] "-" sprintf("%02d", (match("JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC", date[2]) + 2) / 3) "-" date[1] " " date_time[2], $4, $7, $8, $9
}' 13003.ARR > test.csv

답변2

재정렬하려는 날짜 필드가 첫 번째 필드라고 가정하면 다음과 같이 수행할 수 있습니다. 또한 아래와 같이 awk 명령줄에서 날짜 필드 인덱스를 변경할 수도 있습니다.

awk \
  -v dtFldIdx=1 \
  -v century="$(date '+%C')" \
  -v m=";$(LC_ALL=C locale mon)" \
'
BEGIN {
  FS = OFS = ","
  for (i=1; match(m,/;/); i += sub(/;/,"",m))
    a[toupper(substr(m,RSTART+1,3))] = i
  f="%s-%s-%s %%s"; g="%02d"
  fmt = sprintf(f,g g,g,g)
}
{split(FILENAME,arr,".")}
{
  # transform the date field
  split($(dtFldIdx),d,/[-[:blank:]]+/)
  day=d[1]
  mon=a[toupper(d[2])]
  yy=d[3]
  hhmmss=d[4]
  var = sprintf(fmt,century,yy,mon,day,hhmmss)

print NR, arr[1], var, $4, $7, $8, $9}
' file.csv

관련 정보