我正在尝试编写一个命令来查找csv文件中与模式匹配的特定列所在的行。我正在努力进行该列的模式匹配
任务:打印第5列(第5列日期)为2022年6月、7月或8月的行
示例csv文件:
| 列1|列2|第3栏|第4栏|列5日期|第6列|
| - ------|- ------|- ------|- ------|- ------|- ------|
| ABCD的|asdd语言|小行星2022| asdd语言|2022年7月4日|一些东西|
| ABCD的|asdd语言|小行星2022| asdd语言|2022年9月10日|一些东西|
| ABCD的|asdd语言|小行星2022| asdd语言|2020年12月12日|一些东西|
| ABCD的|asdd语言|小行星2020| asdd语言|9/1/19|一些东西|
| ABCD的|asdd语言|小行星2020| asdd语言|9/1/22|一些东西|
| ABCD的|asdd语言|小行星2021| asdd语言|2019年9月22日|一些东西|
| ABCD的|asdd语言|小行星2021| asdd语言|2022年2月16日|一些东西|
| ABCD的|asdd语言|小行星2021| asdd语言|6月16日22日|一些东西|
命令后的预期输出:第一行和最后一行是六月和七月。
我的awk命令:
cat file | awk -F'|' '$5 ~ /(6|7|8)\/*\/22$/'
在模式"/(6|7|8)\/*\/22$/"
中我想说的是
m/d/Y - m为6、7或8
- 一天
22$ -用于年度和列末
- 一天
6条答案
按热度按时间vwkv1x7d1#
我会用类似于
这样就不必转义'/',而且还可以拒绝格式不正确日期
d4so4syb2#
像这样,假设文件是
csv
(逗号),而不是tsv
(制表符),甚至|
(管道)分隔文件:但在示例输入中没有匹配的行
oxcyiej73#
模式
\/*
的这一部分重复0+次正斜杠,而不是匹配日期。您可以将days部分的匹配范围缩小到数字(仍然无法验证有效日期),并且可以省略
cat
命令。如果使用逗号作为分隔符,则使用
awk -F,
9njqaruj4#
假设数据格式正确,则可以消除格式匹配。
xdnvmnnf5#
与您显示的样本和尝试,请尝试以下
awk
代码。这里是完整的Online Demo使用正则表达式的解释。代码在这里匹配六月的确切日期范围(因为它的日期不能超过30),同样的事情与七月和八月,它将匹配日期范围,直到31只为这些月份的行。klh5stk16#
我不清楚输入文件是如何分隔的,所以为了演示的目的,我假设是逗号分隔的:
一个
awk
创意:这将产生: