我尝试使用 awk 将时间戳字符串转换为 unix 纪元时间,但多次尝试后失败。
$ echo "2024-04-16 16:32:38.108580" | awk '{ epoch = mktime(gensub(/[:-]/, " ", "g", $1)) + substr($1, index($1, ".")+1) ; print epoch }'
2023
您正在
$1
上进行手术,但应该在 $0
上进行手术。如果您检查了命令的中间步骤,您就会看到这一点。
这应该有效:
$ echo "2024-04-16 16:32:38.108580" |
awk '{
i = index($0, ".")
datespec = gensub(/[:-]/, " ", "g", substr($0,1,i-1))
epoch = mktime(datespec) + substr($0,i)
printf "%f\n", epoch
}'
1713281558.108580
$
mktime()
正在寻找格式为YYYY MM DD HH MM SS
的输入,所以在这种情况下我们想要:
### convert this:
2024-04-16 16:32:38.108580
### to this:
2024 04 16 16 32 38
我们可以通过几种方式做到这一点:
gensub(/[:-]|[.].*$/, " ", "g")
gsub(/[:-]|[.].*$/, " ")
因为我没有指定字段或变量来操作函数,所以操作整行(即
$0
)。
OP 的代码仅对第一个空格分隔的字符串 (
$1
) 执行操作,在本例中为 2024-04-16
。 OP 需要指定前 2 个字段 ($1 " " $2
) 或整行($0
- 如果未指定字段则默认行为)。
由于示例输入只有 2 个空格分隔的字段,我们将继续处理整行 (
$0
)。
将这些更改拉入新的
awk
脚本中:
### verify conversion of input format:
$ echo "2024-04-16 16:32:38.108580" | awk '{ print gensub(/[:-]|[.].*$/, " ",
“g”)}' 2024年04月16日16日32日38日
### convert to epoch seconds:
$ echo "2024-04-16 16:32:38.108580" | awk '{ print mktime(gensub(/[:-]|[.].*$/, " ", "g")) }'
1713303158
### reverse operation to verify we've got the correct epoch seconds
$ date '+%Y-%m-%d %H:%M:%S' -d @1713303158
2024-04-16 16:32:38