在 gawk 或 awk 中将字符串转换为日期时间戳

在 gawk 或 awk 中将字符串转换为日期时间戳

我想转换以下字符串(20140805234656) 转换为日期时间戳 (2014-08-05 23:46:56)。我是 gawk 的新手,我不知道确切的语法,我该怎么写-每 5,8 点和:每 14,17 处并在 11 索引处放置“ ”。 awk 有没有有效的方法来实现这一点?

编辑

请注意,我在 awk 中将字符串作为变量。我在记录的某些处理过程中生成了它。

答案1

使用 GNU awk 执行此操作的一种方法是:

echo 20140805234656 | awk 'BEGIN { FIELDWIDTHS = "4 2 2 2 2 2" } { printf "%s-%s-%s %s:%s:%s\n", $1, $2, $3, $4, $5, $6 }'

答案2

您可以按如下方式使用子字符串:

echo 20140805234656 | awk '{print substr($0,1,4)"-"substr($0,5,2)"-"substr($0,7,2)" "substr($0,9,2)":"substr($0,11,2)":"substr($0,13,2) }'

也许还有更简单的方法。

答案3

另一个 GNU awk 答案

gawk -v timestamp=20140805234656 '
    BEGIN {
        if (match(timestamp, /(....)(..)(..)(..)(..)(..)/, m)) {
            t = mktime(m[1] " " m[2] " " m[3] " " m[4] " " m[5] " " m[6])
            print strftime("%F %T", t)
            print strftime("%c", t) 
        }
    }
'
2014-08-05 23:46:56
Tue Aug  5 23:46:56 2014

答案4

尝试:

echo 20140805234656 | awk ' { printf "%s-%s-%s %s:%s:%s", 
                                     substr($0,1,4),
                                     substr($0,5,2),
                                     substr($0,7,2),
                                     substr($0,9,2),
                                     substr($0,11,2),
                                     substr($0,13,2)
                             } '

或者,如果您想先将其分配给变量:

echo 20140805234656 | awk ' { d=sprintf ("%s-%s-%s %s:%s:%s", 
                                     substr($0,1,4),
                                     substr($0,5,2),
                                     substr($0,7,2),
                                     substr($0,9,2),
                                     substr($0,11,2),
                                     substr($0,13,2));
                              print "Date is: " d
                             } '

相关内容