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 awk
– mktime
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