我想将以下字符串(20140805234656)转换为日期时间戳(2014-08-05 23:46:56)。我是 gawk 的新手,我不知道确切的语法,我该如何放置-每 5 个, 8 和:在每 14,17 处,并在 11 索引处放置“”。有没有什么有效的方法可以在 awk 中实现这一点?
编辑
请注意,我在 awk 中将字符串作为变量。我在某些记录处理过程中生成了它。
小智 14
使用 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 }'
Run Code Online (Sandbox Code Playgroud)
Val*_*ami 10
您可以使用子字符串如下:
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) }'
Run Code Online (Sandbox Code Playgroud)
可能还有更简单的方法。
另一个 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)
}
}
'
Run Code Online (Sandbox Code Playgroud)
2014-08-05 23:46:56
Tue Aug 5 23:46:56 2014
Run Code Online (Sandbox Code Playgroud)
另一种GNUawk
方法:
result = gensub("(....)(..)(..)(..)(..)", "\\1-\\2-\\3 \\4:\\5:", 1, your_variable)
Run Code Online (Sandbox Code Playgroud)