我正在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
答案 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