sed 根据特定字段的选择删除行

sed 根据特定字段的选择删除行

输入:

coupon,11/2018,1
voucher,04/2018,2

输出:

coupon,11/2018,1

我想从大文件中删除毫米/年所在的11/2018$2

答案1

$ awk -F '[,/]' '($3 == 2018 && $2 >= 11) || $3 > 2018' file
coupon,11/2018,1

将输入视为由逗号或斜杠分隔,输入的第二个字段将是月份,第三个字段将是年份。

awk如果年份是 2018 年并且月份大于或等于 11,或者年份大于 2018 年,则程序将打印输入。

执行此操作sed需要使用正则表达式确定日期是在 2018 年 11 月之前还是之后。这一点很重要。

匹配任何大于 2018 的 4 位整数的正则表达式:

[3-9][0-9]{3}|2[1-9][0-9]{2}|20[2-9][0-9]|2019
^^^^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^^^^ 
3000-9999     2100-2999      2020-2099

所以sed命令变成

$ sed -n -E '\#(1[12]/2018)|([01][0-9]/([3-9][0-9]{3}|2[1-9][0-9]{2}|20[2-9][0-9]|2019))#p' file
coupon,11/2018,1

答案2

GNUawk方法:

样本文件:

coupon,11/2018,1
voucher,04/2018,2
a,31/2016,b
aa,02/2019,bb

awk -v d=$(date +%s -d"11/01/2018") \
-F',' '{ split($2, a, "/") }mktime(sprintf("%d %d 01 00 00 00", a[2], a[1])) >= d' file

输出:

coupon,11/2018,1
aa,02/2019,bb

相关内容