Awk:寻找更好的过滤日期列的方法

问题描述 投票:0回答:1

我有以下文件,名为dates.csv

1,2020-01-27,mom,walk1
2,2023-07-27,dad,walk2
3,2020-06-04,uncle jeff,walk2
4,2022-04-26,uncle celso,walk3
5,2020-01-06,mom,walk2
6,2023-01-19,val,walk1
7,2019-12-02,otice,walk2
8,2021-01-20,uncle celso,walk1
9,2021-04-16,dad,walk3
10,2023-10-03,dad,walk2
11,2021-04-16,uncle jeff,walk3
12,2019-10-11,uncle jeff,walk3
13,2023-01-04,dad,walk3
14,2019-08-22,uncle celso,walk2
15,2022-04-27,val,walk3
16,2019-04-01,dad,walk1
17,2021-01-27,uncle jeff,walk2
18,2019-12-02,val,walk2
19,2022-04-20,uncle celso,walk2
20,2022-07-04,uncle jeff,walk3

我正在尝试以比使用 awk 更复杂的方式过滤日期。我目前正在做的事情如下。如果我想选择大于或等于 2020-06-04 的日期,我会运行

awk 'BEGIN{FS=OFS=","}$2 >= 20200604{print $2=gensub(/(....)-(..)-(..)/,"\\1\\2\\3",1)}' dates.txt | \
sed 's/,\(....\)\(..\)\(..\)/,\1-\2-\3/1'

这给出了

2,2023-07-27,dad,walk2
4,2022-04-26,uncle celso,walk3
6,2023-01-19,val,walk1
8,2021-01-20,uncle celso,walk1
9,2021-04-16,dad,walk3
10,2023-10-03,dad,walk2
11,2021-04-16,uncle jeff,walk3
13,2023-01-04,dad,walk3
15,2022-04-27,val,walk3
17,2021-01-27,uncle jeff,walk2
19,2022-04-20,uncle celso,walk2
20,2022-07-04,uncle jeff,walk3

如果我想选择小于或等于 2020-06-04 的日期,我会运行

awk 'BEGIN{FS=OFS=","}$2 <= 20200604{print $2=gensub(/(....)-(..)-(..)/,"\\1\\2\\3",1)}' dates.txt | \
sed 's/,\(....\)\(..\)\(..\)/,\1-\2-\3/1'

导致

1,2020-01-27,mom,walk1
3,2020-06-04,uncle jeff,walk2
5,2020-01-06,mom,walk2
7,2019-12-02,otice,walk2
12,2019-10-11,uncle jeff,walk3
14,2019-08-22,uncle celso,walk2
16,2019-04-01,dad,walk1
18,2019-12-02,val,walk2

我一直在尝试使用 mktime()、strftime() 但无法得到比我所得到的更好的东西。我很高兴提前对此有任何想法。

date awk
1个回答
0
投票

你可以这样简化:

awk -v date=20200604 'BEGIN{FS=OFS=","} $2 >= date' file
© www.soinside.com 2019 - 2024. All rights reserved.