【问题标题】:How to regex today or previous days date using awk and $date?如何使用 awk 和 $date 正则表达式今天或前几天的日期?
【发布时间】:2021-08-09 15:47:53
【问题描述】:

我的数据的第 13 列包含 YYMMDD 格式的日期。我正在尝试对今天和前几天使用 $date 进行正则表达式。以下代码都不起作用。有人能给我一些见解吗?

今天

awk -F, ($13~/$(date '+%Y%m%d')/) {n++} END {print n+0}' file.csv)

3 天前

awk -F, ($13~/$(date -d "$date -3 days" '+%Y%m%d')/) {n++} END {print n+0}' file.csv

【问题讨论】:

  • 欢迎来到 SO,感谢您的努力。您能否在您的问题中添加输入和预期输出示例以使其更清晰。
  • 正如我在your previous question 上对您发表的评论,请考虑:stackoverflow.com/q/6697753/10971581
  • 您使用的是什么日期命令?在 OSX 上 -d 设置时区, -v 用于计算时间增量。所以date '+%Y%m%d' 是现在,date -v-72H '+%Y%m%d' 是提前 3 天(72 小时)。
  • 您好,欢迎来到 SO。您显示的命令甚至在语法上都不正确。你试过了吗?

标签: date awk


【解决方案1】:

您的 Awk 尝试存在相当严重的引用问题。您通常需要单引号引用您的 Awk 脚本,并使用 -v 将任何参数作为变量传递。

awk -F, -v when="$(date -d "-3 days" '+%Y%m%d')" '$13~when {n++} END {print n+0}' file.csv

也许还注意到$date 没有在任何地方定义。符号 $(cmd ...) 是一个命令替换,它运行 cmd ... 并将表达式替换为其输出。

可能还注意到date -d 是一个 GNU 扩展并且不可移植,尽管它可以在您安装了 GNU 实用程序的 Linus 和其他平台上工作。

从根本上说,根据$13 中的内容,您可能希望对该格式实施简单的日期解析,以便您可以指定可接受值的范围,而不是在静态文本上搜索匹配项。

这个引用对于 Bourne 风格的 Unix shell 是正确的。如果您使用的是 Windows,则引用规则会大不相同,而且很可能通常无法以有用的方式应用。

【讨论】:

    【解决方案2】:

    如果您使用的是 GNU AWK,那么您可以使用它的“Time Functions”来检查它是否有效

    awk 'END{print strftime("%y%m%d")}' emptyfile.txt
    

    应该以YYMMDD 格式输出当前日期。如果确实如此,那么您可能会通过以下方式得到您想要的:

    awk 'BEGIN{today=strftime("%y%m%d");threedago=strftime("%y%m%d",systime()-259200)}END{print today, threedago}' emptyfile.txt
    

    输出(截至今天)

    210809 210806
    

    解释:strftime 第一个参数是时间格式 %y 是年 00...99,%m 是月 01...12,%d 是天 01...31。第二个参数是可选的,它是自纪元开始以来的秒数。如果使用跳过的当前时间,systime() 返回自纪元开始以来的秒数,259200 为 72 小时秒数。

    正则表达式的用法示例,假设我有file.txt如下

    210807 120
    210808 150
    210809 100
    

    想要获取今天第 2 栏的内容,可以这样做

    awk 'BEGIN{today=strftime("%y%m%d")}$1~today{print $2}' file.txt
    

    获得输出(截至今天)

    100
    

    (在 gawk 4.2.1 中测试)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多