我正在使用一个 csv 文件,其中包含以下结构的数据:
"12345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333,"15/12/2017 4:26:00 PM"
我想将 12 小时时间转换为 24 小时时间。以下显示了我最终想要实现的目标:
"12345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333,"15/12/2017 16:26:00"
我发现以下问题的答案似乎解决了我的问题的时间段的转换。 https://stackoverflow.com/questions/8083973/bash-and-awk-converting-a-field-from-12-hour-to-24-hour-clock-time#8084087
因此,有了上述内容,我相信我必须执行以下过程(可能有更有效的方法):
暂时将日期和时间分离到自己的记录中
"12345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333,"15/12/2017","4:26:00 PM"
- 瞄准时间记录并将其转换为我想要的24小时格式
- 将日期和时间记录连接回单个记录
我正在尝试使用 awk 来实现这一目标,但我陷入了第一部分! awk 是适合这项工作的工具吗?或者您会推荐其他工具吗?
我从第 1 步开始。我什至无法成功确定日期!
awk 'BEGIN {FS=","} { gsub(/[0-9]\{2\}\/[0-9]\{2\}\/[0-9]\{4\}/, "TESTING"); print }' myfile.csv
答案1
我会perl
在这里使用:
perl -pe 's{\b(\d{1,2})(:\d\d:\d\d) ([AP])M\b}{
$1 + 12 * (($3 eq "P") - ($1 == 12)) . $2}ge'
也就是说,如果是 PM(中午 12 点除外),则在小时部分加 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}'
答案2
此解决方案将每行中的所有 12 小时格式的项目转换为 24 小时格式。
gawk -F, '
{
for(i = 1; i <= NF; i++) {
if($i ~ /:[0-9]{2} [PA]M/) {
split($i, arr, ":| ")
if(arr[5] ~ /P/)
arr[2] += 12
$i = sprintf("%s %02d:%02d:%02d\"", arr[1], arr[2], arr[3], arr[4])
}
}
print
}' OFS=, input.txt
输入
"12345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333","15/12/2017 4:26:00 PM"
"22345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333","16/12/2017 6:26:00 AM"
"32345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333","17/12/2017 10:00:00 PM"
"42345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333","18/12/2017 11:26:00 AM"
"52345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333","19/12/2017 2:26:00 PM"
输出
"12345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333","15/12/2017 16:26:00"
"22345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333","16/12/2017 06:26:00"
"32345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333","17/12/2017 22:00:00"
"42345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333","18/12/2017 11:26:00"
"52345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333","19/12/2017 14:26:00"