Conversion d’horodatage en EPOCH en awk

Je convertis les horodatages en secondes EPOCH en awk , obtenant une sortie incorrecte pour les horodatages répétés

Consortingbution:

 20180614 00:00:00 20180614 00:00:23 20180614 22:45:00 20180614 22:45:21 20180614 00:00:00 20180614 00:00:23 

Production attendue :

 1528930800 1528930823 1528930800 1529012721 1528930800 1528930823 

J’ai fait

 awk '{ ts="\""$0"\""; ("date +%s -d "ts)| getline epochsec; print epochsec}' 

sortie après exécution de la commande ci-dessus:

 1528930800 1528930823 1529012700 1529012721 1529012721 1529012721 

Avec GNU xargs:

 xargs -I {} date +%s -d {} < file 

Sortie:

 1528927200
 1528927223
 1529009100
 1529009121
 1528927200
 1528927223

Une version GNU awk un peu plus courte utilise FIELDWIDTHS disponible à partir de gawk-2.13 :

 awk 'BEGIN{FIELDWIDTHS="4 2 3 2 1 2 1 2"}{print mktime($1" "$2" "$3$4" "$6" "$8)}' 

Depuis gawk-4.2, vous pouvez ignorer les champs intermédiaires :

 awk 'BEGIN{FIELDWIDTHS="4 2 2 1:2 1:2 1:2"}{print mktime($1" "$2" "$3" "$4" "$5" "$6)}' 

Ou encore plus court en utilisant FPAT

 awk 'BEGIN{FPAT="[0-9][0-9]"}{print mktime($1$2" "$3" "$4" "$5" "$6" "$7)} 

Remarque: l’utilisation d’une seule combinaison awkmktime sera plus rapide que tout ce qui rend les appels système à date car vous ne devez pas constamment appeler un binary. Avec la solution awk mktime, vous appelez un seul binary. Néanmoins, la solution xargs proposée par Cyrus est de loin la plus confortable.

Vous pouvez utiliser la fonction system

 $ awk '{system("date +%s -d \""$0"\"")}' ip.txt 1528914600 1528914623 1528996500 1528996521 1528914600 1528914623 

Ou utilisez sed

 $ sed 's/.*/date +%s -d "&"/e' ip.txt 1528914600 1528914623 1528996500 1528996521 1528914600 1528914623 

Selon l’ article AllAboutGetline , vous aurez besoin de

 $ awk '{ ts="date +%s -d \""$0"\""; while ((ts|getline ep)>0) print ep; close(ts) }' ip.txt 1528914600 1528914623 1528996500 1528996521 1528914600 1528914623 

Cependant, getline n’est pas du tout nécessaire pour ce cas et évitez de l’utiliser à moins que vous en ayez vraiment besoin et que vous sachiez comment l’utiliser.

Utiliser la fonction GNU awk mktime :

  awk '{gsub(":"," ",$2); print mktime(substr($1,1,4) " " substr($1,5,2) " " substr($1,7,2) " " $2)}' file