我有一个 csv 文件,如下所示:(第二列是日期模式)
qqq.eee,2015-10-12
rrr-ttt,2015-11-23
aaapppp,2022-01-10
ddd_fff,2017-05-23
zzzbbbb,2013-09-20
nnnmmmm,2015-06-17
wwwwwww,2014-11-20
uuu-uuu,2016-12-10
ppppppp,2015-10-19
kkkkkkk,2016-12-25
我想获取第二列匹配的行,如下所示:
year between two number(for example): 2014<= year =<2016
month between two number(for example): 10<= month =<12
day between two number(for example): 20<= day =<30
然后得到输出如下:
rrr-ttt,2015-11-23
wwwwwww,2014-11-20
kkkkkkk,2016-12-25
这可以用 awk 实现吗?
答案1
awk
最适合列和多条件过滤。然而,这个特殊问题也可以通过以下方法解决:grep
$ grep -E '201[4-6]-1[0-2]-(2[0-9]|30)$' ip.csv
rrr-ttt,2015-11-23
wwwwwww,2014-11-20
kkkkkkk,2016-12-25
-E
使用扩展正则表达式201[4-6]
2014年至2016年范围1[0-2]
范围为 10 到 122[0-9]
范围为 20 至 29- 使用分组和交替,
(2[0-9]|30)
给出范围 20 到 30
- 使用分组和交替,
$
行结束- 进一步阅读:http://www.regular-expressions.info/numericranges.html
答案2
由于分隔符,我只是从结尾到开头进行比较
awk -F[-,] '$NF >= 20 && $NF <= 30 && $(NF-1) >= 10 &&
$(NF-1) <= 12 && $(NF-2) >= 2014 && $(NF-2) <= 2016' yourfile
NF
是最后一个字段,$NF
是值,$(NF-1)
是最后一个字段之前的字段的值,依此类推$NF
日月$(NF-1)
年$(NF-2)