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