首页 > 解决方案 > 如何使用 AWK/GAWK 选择/打印格式为 YYYY/MM/DD 的两个日期之间的记录/行?

问题描述

我有一个与 gawk 中的 range 选项有关的问题BEGPAT, ENDPAT {ACTION},它似乎不适合我的情况,或者更可能是我对 range 工作原理的误解。

我想打印/选择格式为 YYYY-MM-DD 的日期范围之间的记录/行。日期在特定的字段/列中,它们按升序排列,并且它们不是唯一的,即:

2021-08-01
2021-08-02
2021-08-02
2021-08-02
2021-08-03
2021-08-04
2021-08-05
2021-08-05
2021-08-05

我该如何选择可以说,从 2021-08-02 到 2021-08-05,实际数据可以追溯到两年前,以获得:

2021-08-02
2021-08-02
2021-08-02
2021-08-03
2021-08-04
2021-08-05
2021-08-05
2021-08-05

我尝试了以下方法: '/2021-08-03/, /2021-08-05/{print}'

结果是:

2021-08-03
2021-08-04
2021-08-05

感谢 gawk/awk 范围内的任何帮助。关于范围的文档是here,但是由于我只是想学习编码,因此有时很难理解。也许awk中还有其他方法可以解决这个问题?

标签: awk

解决方案


awk -v beg='2021-08-02' -v end='2021-08-05' '
    $1 >= beg { inRange=1 }
    $1 > end { exit }
    inRange { print }
' file

除非您为了简洁而严格编码,否则范围表达式永远不是最好的方法,您应该始终使用标志变量(我inRange在上面命名但ffound或您喜欢的任何其他名称也可以),请参阅Is a /start/, /end/ 范围表达式在 awk 中有用吗?.

如果您更喜欢更简洁的解决方案,您可以使用硬编码值和更短的变量名称来执行上述操作:

awk '$1=="2021-08-02"{f=1} $1>"2021-08-05"{exit} f' file

请注意,除其他事项外,上述方法比使用范围表达式更有效,因为它将在打印范围后退出,而不是继续读取输入的其余部分。


推荐阅读