使用 awk 将日期时间戳从 12 小时转换为 24

Gus*_*ler 5 awk text-processing mawk

我正在使用一个包含以下结构数据的 csv 文件:

"12345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333,"15/12/2017 4:26:00 PM"
Run Code Online (Sandbox Code Playgroud)

我想将 12 小时制转换为 24 小时制。以下显示了我最终想要实现的目标:

"12345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333,"15/12/2017 16:26:00"
Run Code Online (Sandbox Code Playgroud)

我找到了以下问题的答案,该问题似乎解决了我的问题时间段的转换。 /sf/ask/565878141/#8084087

所以有了以上,我相信我必须做以下过程(可能有更有效的方法):

  1. 暂时将日期和时间分成自己的记录

    "12345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333,"15/12/2017","4:26:00 PM"

  2. 定位时间记录并将其转换为我想要的 24 小时格式
  3. 将日期和时间记录连接回单个记录

我正在尝试使用 awk 来实现这一点,但被困在第一部分!awk 是适合这项工作的工具,还是您会推荐其他工具?

我从第 1 步开始。我什至无法成功定位日期!

awk 'BEGIN {FS=","} { gsub(/[0-9]\{2\}\/[0-9]\{2\}\/[0-9]\{4\}/, "TESTING"); print }' myfile.csv
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 6

我会perl在这里使用:

perl -pe 's{\b(\d{1,2})(:\d\d:\d\d) ([AP])M\b}{
  $1 + 12 * (($3 eq "P") - ($1 == 12)) . $2}ge'
Run Code Online (Sandbox Code Playgroud)

如果 PM(12PM 除外),则将 12 添加到小时部分并将 12AM 更改为 0。

使用awk,不做单词边界部分(例如,可能会出现误报123:21:99 AMERICA)并假设每行只出现一次:

awk '
  match($0, /[0-9]{1,2}:[0-9]{2}:[0-9]{2} [AP]M/) {
    split(substr($0, RSTART, RLENGTH), parts, /[: ]/)
    if (parts[4] == "PM" && parts[1] != 12) parts[1] += 12
    if (parts[4] == "AM" && parts[1] == 12) parts[1] = 0

    $0 = substr($0, 1, RSTART - 1) \
         parts[1] ":" parts[2] ":" parts[3] \
         substr($0, RSTART + RLENGTH)
  }
  {print}'
Run Code Online (Sandbox Code Playgroud)