我有一个逗号分隔文件,其中一个字段包含以下格式的日期时间:
01/15/2014 13:53
我需要将该字段的时间部分缩小到最接近的四分之一小时。我只能以日期/时间作为输入来获取awk来执行舍入,但是我无法获取awk来读取文件&执行舍入。这是用于将日期/时间四舍五入为直接输入的awk命令:
echo "04/17/2014 12:59" | awk '{split($2, a, ":"); printf "%s %s:%02d", $1, a[1],int(a[2]/15)*15}'
如何使用整个文件作为输入执行相同的舍入,日期/时间是逗号分隔文件中的第3个字段?
答案 0 :(得分:3)
使用perl
将是紧凑而直接的:
$ echo "04/17/2014 12:59" | perl -pe 's|(?<=:)\d\d\b|int($&/15)*15|ge'
04/17/2014 12:45
说明:
-pe
的{{1}}标志是为每一行运行表达式,可能会修改它,然后打印生成的行,行为类似于perl
或sed
awk
表达式匹配(?<=:)\d\d\b
后的两位数字,而不包括匹配模式中的:
(零宽度正面后视)。 :
标记单词边界,因此不匹配“:123”\b
是匹配的模式,在此示例中为59 $&
命令中的e
标志是将替换值评估为perl脚本,允许对匹配的模式执行s///e
算法int(... / 15) * 15
作为分隔符,而不是/
命令中的s///
,以便我们可以在替换模式中使用|
答案 1 :(得分:2)
awk -F, -v OFS=, '
function round_time(t, a) {
split(t,a,/:/)
return sprintf("%s:%02d", a[1], int(a[2] / 15)*15)
}
{$3 = round_time($3); print}
' << END
a,b,01/15/2014 13:53,d
e,f,01/15/2014 14:13,h
END
a,b,01/15/2014 13:45,d
e,f,01/15/2014 14:00,h