3

这是我的情况。

bash ~]# TIME="2012-05-25 06:42:57"
bash ~]# echo "2012-05-25 00:16:51,610" | awk -v var=$TIME '{if ($0 < var) print $0}'

然后,这是错误消息

awk: 06:42:57
awk:   ^ syntax error

我只想将日期范围传递给我的 awk 命令。这个怎么存档?请帮忙。谢谢。

修改案例

START_TIME="2012-05-24 00:00:00"
END_TIME="2012-05-24 01:00:00"
echo "2012-05-24 00:10:10" | awk -v "START=$START_TIME" -v "END=$END_TIME" '{ if ( $0 > START && $0 < END) print $0 }'

它似乎在 IF 条件下不起作用。

awk: { if ( $0 < START && $0 > END) print $0 }
awk:                           ^ syntax error

经过多次尝试,似乎找到了另一种方法的解决方案。

echo "2012-05-24 00:10:10" | awk '{ if ( $0 > "'"$START_TIME"'" && $0 < "'"$END_TIME"'" ) print $0 }'

不知道如何使用 awk 变量“-v”来做到这一点。有人有想法吗?

4

2 回答 2

7

将变量传递给 AWK 时引用它:

echo "2012-05-25 00:16:51,610" | awk -v "var=$TIME" '{if ($0 < var) print $0}'
于 2012-05-25T16:32:27.023 回答
1

至少在我的系统上,“END”似乎是一个保留字,即使对于变量也是如此。awk 使用 END 就像使用 BEGIN 一样,但我之前没有看到有人尝试将它用作变量。笔记:

[ghoti@pc ~]$ START_TIME="2012-05-24 00:00:00"
[ghoti@pc ~]$ END_TIME="2012-05-24 01:00:00"
[ghoti@pc ~]$ echo "2012-05-24 00:10:10" | awk -v "START=$START_TIME" -v "END=$END_TIME" '{ if ( $0 < START && $0 > END) print $0 }'
awk: syntax error at source line 1
 context is
        { if ( $0 < START && $0 > >>>  END <<< ) print $0 }
awk: illegal statement at source line 1
[ghoti@pc ~]$ echo "2012-05-24 00:10:10" | awk -v s_time="$START_TIME" -v e_time="$END_TIME" '{ if ( $0 < s_time && $0 > e_time) print $0 }'
[ghoti@pc ~]$ 

显然这仍然不起作用,但现在它不起作用是因为对比较如何工作的误解,而不是因为我们试图使用保留字作为变量。

查看您的if陈述,您似乎仅在比较字符串在开始日期之前和结束日期之后才尝试评估 TRUE 。除非时间是循环的理论,我认为我们可以假设这种逻辑是有缺陷的。

所以这就是我想出的。请注意,这使用gawk'mktime()功能,因此它不会在任何地方都有效。

[ghoti@pc ~]$ START_TIME="2012-05-24 00:00:00"
[ghoti@pc ~]$ END_TIME="2012-05-24 01:00:00"
[ghoti@pc ~]$ printf '2012-05-23 22:10:10\n2012-05-24 00:10:10\n2012-05-24 01:10:10\n' | gawk -v s_time="$START_TIME" -v e_time="$END_TIME" 'BEGIN { s=mktime(gensub(/[^0-9]/," ","G",s_time)); e=mktime(gensub(/[^0-9]/," ","G",e_time)); } { now=mktime(gensub(/[^0-9]/," ","G")); if ( now > s && now < e) print $0 }'
2012-05-24 00:10:10
[ghoti@pc ~]$ 

为了便于阅读,gawk 脚本如下所示:

BEGIN {
    s=mktime(gensub(/[^0-9]/," ","G",s_time));
    e=mktime(gensub(/[^0-9]/," ","G",e_time));
}
{
    now=mktime(gensub(/[^0-9]/," ","G"));
    if ( now > s && now < e) print $0;
}

显然,这完全依赖于您的日期/时间规范与mktime()' 的输入格式非常匹配的事实。但它适用于您问题中的示例数据。

于 2012-05-26T04:51:30.077 回答