如何使用 AWK/GAWK 格式化时间戳字段

如何使用 AWK/GAWK 格式化时间戳字段

我正在使用 GAWK 处理一个 CSV 文件,该文件有一个时间戳格式类似于“18-APR-22 11:00:00”的字段。我想在 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 只需三秒即可运行。

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

相关内容