如何在awk命令中多次使用strftime函数

时间:2016-08-25 11:29:49

标签: awk gawk strftime

我想使用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?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您不需要'$'符号来取消引用变量。试试这个:

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);}'