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
所以有了以上,我相信我必须做以下过程(可能有更有效的方法):
暂时将日期和时间分成自己的记录
"12345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333,"15/12/2017","4:26:00 PM"
我正在尝试使用 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)
我会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)