Convertir la string en horodatage en gawk ou awk

Je veux convertir la string suivante ( 20140805234656 ) en horodatage ( 2014-08-05 23:46:56 ). Je suis nouveau à gawk et je ne connais pas la syntaxe exacte, comment puis-je mettre à tous les 5, 8 et : à tous les 14,17 et mettre "" à 11 index. Existe-t-il un moyen efficace de réaliser cela dans awk?

MODIFIER

S'il vous plaît noter que j'ai une string comme variable dans awk.I généré pendant un certain traitement des loggings.

Une façon de le faire en utilisant GNU awk est la suivante:

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 }' 

Vous pouvez utiliser la sous-string comme suit:

 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) }' 

Probablement il y a des moyens plus faciles aussi.

Une autre réponse 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 

Une autre approche GNU awk :

 result = gensub("(....)(..)(..)(..)(..)", "\\1-\\2-\\3 \\4:\\5:", 1, your_variable) 

Essayer:

 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) } ' 

Ou, si vous voulez l'atsortingbuer d'abord à une variable:

 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 } ' 

Autrement:

 $ echo 20140805234656 | awk '{split($0,a,"");printf("%s-%s-%s %s:%s:%s\n",a[1]a[2]a[3]a[4],a[5]a[6],a[7]a[8],a[9]a[10],a[11]a[12],a[13]a[14])}' 2014-08-05 23:46:56