我需要按日期过滤 csv 文件的一行。
该文件的结构如下:
[email protected] active 01/24/11 10:04 07/23/23 16:56
[email protected] active 04/07/14 15:56 04/23/21 04:02
[email protected] active 07/27/12 16:24 11/13/12 01:14
[email protected] active 11/02/10 14:00 09/05/14 11:34
[email protected] active 05/19/11 18:11 03/25/15 12:22
[email protected] active 06/26/14 12:45 03/05/19 20:27
我能够使用以下方法按日期排序:
awk '{print $1 "," $3 "," $5}' | sort -t "," -n -k 2.7,5 -k 2.8,5 -k 2.1,5 -k 2.2,5 -k 2.4,5 -k 2.5,5
这给了我按日期排序的行。
例子:
[email protected],01/24/11,07/23/23
[email protected],04/07/14,04/23/21
[email protected],07/27/12,11/13/12
有没有办法按日期过滤此输出?比如说仅打印 12/11/22 之后的行,或者仅打印给定字段或列的 12/11/22 之前的行?
我尝试过的:
grep -e '[3-9].$' -e '2[3-9]$' -e '12/[1-3]./22$' myfile.csv
至于输出,此命令会过滤第三行 $3。因此,此示例的输出为:
[email protected],01/24/11,07/23/23
这有效,但只针对第三列中的一个日期,而且我不太明白它的作用,或者如何根据请求数据的日期范围来更改它。
谢谢!
答案1
你可以使用磨坊主,一个很好的 CSV 感知 cli。
你可以运行示例
mlr --nidx --repifs filter 'strptime($3,"%m/%d/%y")>strptime("11/13/12","%m/%d/%y")' input.csv
$3
过滤掉第三个字段( )大于的所有记录11/13/12
,得到
[email protected] active 04/07/14 15:56 04/23/21 04:02
[email protected] active 06/26/14 12:45 03/05/19 20:27
一些说明:
--nidx --repifs
设置数据格式,索引编号(工具包样式),字段分隔符重复(空格)filter
,将过滤器应用于字段的动词strptime
,设置日期格式的函数。
答案2
由于您已经对列表进行了排序,请尝试以下命令
$ cat a.txt
[email protected],01/24/11,07/23/23
[email protected],04/07/14,04/23/21
[email protected],07/27/12,11/13/12
过滤字符串匹配之前的所有行(包括匹配的行)
$ cat a.txt | sed '/04\/23\/21/q' # use escape sequence for date 04\/23\/21
[email protected],01/24/11,07/23/23
[email protected],04/07/14,04/23/21
过滤匹配字符串之后的所有行(包括匹配的行)
$ cat a.txt | sed -n '/04\/23\/21/,$p' # use escape sequence for date 04\/23\/21
[email protected],04/07/14,04/23/21
[email protected],07/27/12,11/13/12