在AWK中将时间戳转换为EPOCH

时间:2018-06-20 07:47:51

标签: unix awk

我正在awk中将时间戳转换为EPOCH秒,对于重复的时间戳会得到错误的输出

输入:

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

预期输出:

1528930800
1528930823
1528930800
1529012721
1528930800
1528930823

我做到了

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

运行上述命令后的输出:

1528930800
1528930823
1529012700
1529012721
1529012721
1529012721

5 个答案:

答案 0 :(得分:3)

使用GNU xargs:

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

输出:

1528927200
1528927223
1529009100
1529009121
1528927200
1528927223

答案 1 :(得分:2)

使用FIELDWIDTHS的GNU awk较短版本可以从gawk-2.13起使用:

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

自gawk-4.2起,您可以skip intervening fields

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

或更短使用FPAT

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

注意:单个awk-mktime组合的使用将比使系统调用date的任何方法都快,因为您不经常需要调用二进制文件。使用awk mktime解决方案,您可以调用一个二进制文件。尽管如此,Cyrus提供的xargs解决方案是迄今为止最舒适的解决方案。

答案 2 :(得分:1)

您可以使用system函数

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

或使用sed

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


根据{{​​3}},您将需要

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

但是在这种情况下根本不需要getline,除非您确实需要并知道如何使用它,否则请避免使用它

答案 3 :(得分:1)

使用GNU awk mktime函数:

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

答案 4 :(得分:0)

要添加到Cyrus的答案中,以下内容适用于Mac OSX。奇怪的是,MAC有不同的处理日期时间格式到时代转换的方法。

xargs -I {} date -j -u -f "%a %b %d %T %Z %Y" {} +%s < file