awk - 如何使用 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 -v beg='2021-08-02' -v end='2021-08-05' '
$1 >= beg { inRange=1 }
$1 > end { exit }
inRange { print }
' file
除非您为了简洁而严格编码,否则范围表达式永远不是最好的方法,您应该始终使用标志变量(我inRange
在上面命名但f
或found
或您喜欢的任何其他名称也可以),请参阅Is a /start/, /end/ 范围表达式在 awk 中有用吗?.
如果您更喜欢更简洁的解决方案,您可以使用硬编码值和更短的变量名称来执行上述操作:
awk '$1=="2021-08-02"{f=1} $1>"2021-08-05"{exit} f' file
请注意,除其他事项外,上述方法比使用范围表达式更有效,因为它将在打印范围后退出,而不是继续读取输入的其余部分。
推荐阅读
- latex - 如何将文本直接放在限制函数下方?
- jsp - 如何在一个 JSP 页面上执行 mySQL 查询并在另一个页面上显示结果?
- mysql - 将 mysql 数据转储导入 Maria DB
- javascript - 如何在我的 React Todo 列表中实现 React Beautiful 拖放功能?
- python - 如何在python中加密套接字连接
- create-react-app - 为什么我只在 CRA 构建期间收到 ESLint 警告,而在 CLI 上运行 Eslint 时却没有?
- django - 我不明白如何使用 django 3rd 方库 djangorestframework-api-key
- image - 如何在 OpenShift 上列出所有 docker 图像信息
- apache-flink - Flink 读取 Savepoint 的 keystate 时,任务一直在运行,无法完成
- java - 项目 Reactor 中的并行通量与通量