使用带/文件输入的AWK舍入到最接近的四分之一小时

时间:2014-01-14 18:29:13

标签: shell unix awk

我有一个逗号分隔文件,其中一个字段包含以下格式的日期时间:

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个字段?

2 个答案:

答案 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}}标志是为每一行运行表达式,可能会修改它,然后打印生成的行,行为类似于perlsed
  • 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