Unix 在awk中将时间戳转换为历元
我在Unix 在awk中将时间戳转换为历元,unix,awk,Unix,Awk,我在awk中将时间戳转换为历元秒,重复时间戳的输出不正确 输入: 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 是的 运行上述命令后的输出: 1528930800 152893082
awk
中将时间戳转换为历元秒,重复时间戳的输出不正确
输入:
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
是的
运行上述命令后的输出:
1528930800
1528930823
1529012700
1529012721
1529012721
1529012721
您可以使用
系统
功能
$ 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
根据,您将需要
$ awk '{ ts="date +%s -d \""$0"\""; while ((ts|getline ep)>0) print ep; close(ts) }' ip.txt
1528914600
1528914623
1528996500
1528996521
1528914600
1528914623
但是,在这种情况下根本不需要使用getline
,除非您确实需要它并且知道如何将它与GNU xargs一起使用,否则请避免使用它:
xargs -I {} date +%s -d {} < file
xargs-I{}date+%s-d{}
输出:
1528927200
1528927223
1529009100
1529009121
1528927200
1528927223
1528927200
1528927223
1529009100
1529009121
1528927200
1528927223
使用GNU awk
mktime
功能:
awk '{gsub(":"," ",$2); print mktime(substr($1,1,4) " " substr($1,5,2) " " substr($1,7,2) " " $2)}' file
正在使用略短的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开始,您可以:
甚至更短的使用时间
注意:使用单个
awk
-mktime
组合将比系统调用date
的任何组合都要快,因为您不必经常调用二进制文件。使用awk
mktime解决方案,您可以调用单个二进制文件。尽管如此,由给出的xargs
解决方案是迄今为止最令人满意的解决方案。为了补充Cyrus的答案,以下内容适用于Mac OSX。奇怪的是,MAC有一种不同的处理日期-时间格式到历元转换的方法
xargs -I {} date -j -u -f "%a %b %d %T %Z %Y" {} +%s < file
xargs-I{}date-j-u-f“%a%b%d%T%Z%Y”{}+%s
感谢Sundeep的建议和回答。。。它的工作原理如何将系统输出(“日期+%s-d\”“$0\”“”)存储到awk中的变量?我需要找到TimeSeem的平均值,就像你需要使用getline一样,根据。。。
awk 'BEGIN{FIELDWIDTHS="4 2 2 1:2 1:2 1:2"}{print mktime($1" "$2" "$3" "$4" "$5" "$6)}'
awk 'BEGIN{FPAT="[0-9][0-9]"}{print mktime($1$2" "$3" "$4" "$5" "$6" "$7)}
xargs -I {} date -j -u -f "%a %b %d %T %Z %Y" {} +%s < file