【问题标题】:How to use strftime function multiple times in an awk command如何在 awk 命令中多次使用 strftime 函数
【发布时间】:2016-08-25 11:29:49
【问题描述】:

我想使用 gawk 将 unix 时间戳转换为日期格式,使用 strftime。

当我使用 strftime 一次时,我得到了预期的结果:

$ echo 1454310000 | gawk -F "," '{$s=strftime("%Y-%m-%d %H:%M:%S", ($1), 1); $e=$s; print ($s, $e);}'
2016-02-01 07:00:00 2016-02-01 07:00:00

但是当我多次使用strftime时,两个返回的结果都是完全错误的:

$ echo 1454310000 | gawk -F "," '{$s=strftime("%Y-%m-%d %H:%M:%S", ($1), 1); $e=strftime("%Y-%m-%d %H:%M:%S", ($1), 1); print ($s, $e);}'
1970-01-01 00:33:36 1970-01-01 00:33:36

为什么会发生这种情况以及如何纠正它以便可以在同一输入上使用 strftime 两次?

【问题讨论】:

  • 您认为$e$s 是什么意思?我认为您在awk 代码中使用了shell 代码样式。请阅读awk 基本指南并了解awk,因为print $n 不打印变量n 的内容,而是输出输入行中的第n字段。
  • 当我运行你的awk 代码时,我得到fatal: 3 is invalid as number of arguments for strftime

标签: awk gawk strftime


【解决方案1】:

这里的问题是变量的使用。在awk 中,变量不以美元开头。所以对var说是,对$var说不:

$ echo 1454310000 | gawk -F "," '{s=strftime("%Y-%m-%d %H:%M:%S", ($1), 1); e=strftime("%Y-%m-%d %H:%M:%S", ($1), 1); print (s, e);}'
2016-02-01 07:00:00 2016-02-01 07:00:00

发生了什么事?

由于se 是未定义的变量,当您说$s=something() 时,您最终将something() 的输出分配给$ 加上一个未定义的变量值,默认为0。而$0 是整个记录,因此您正在分配记录本身的值。

看一个更简单的例子:

$ echo "hello" | awk '{$s="bu"; print}'
bu

【讨论】:

    【解决方案2】:

    您不需要“$”符号来取消引用变量。试试看:

    echo 1454310000 | gawk -F "," '{s=strftime("%Y-%m-%d %H:%M:%S", ($1), 1); e=strftime("%Y-%m-%d %H:%M:%S", ($1), 1); print (s, e);}'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多