αԋɱҽԃ αмєяιcαη Asked: 2018-06-05 01:16:13 +0800 CST2018-06-05 01:16:13 +0800 CST 2018-06-05 01:16:13 +0800 CST sed 根据特定字段的选择删除行 772 输入: coupon,11/2018,1 voucher,04/2018,2 输出: coupon,11/2018,1 我想从大文件中删除 mm/year 所在的11/2018行$2 awk sed 2 个回答 Voted Best Answer Kusalananda 2018-06-05T01:23:15+08:002018-06-05T01:23:15+08:00 $ awk -F '[,/]' '($3 == 2018 && $2 >= 11) || $3 > 2018' file coupon,11/2018,1 将输入视为由逗号或斜线分隔,输入的第二个字段将是月份,第三个字段将是年份。 如果年份是 2018年awk且月份大于或等于 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 RomanPerekhrest 2018-06-05T01:33:57+08:002018-06-05T01:33:57+08:00 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
将输入视为由逗号或斜线分隔,输入的第二个字段将是月份,第三个字段将是年份。
如果年份是 2018年
awk
且月份大于或等于 11,或者年份大于 2018,则程序打印输入。这样做
sed
将涉及必须使用正则表达式确定日期是在 2018 年 11 月之前还是之后。这很重要。匹配任何大于 2018 的 4 位整数的正则表达式:
所以
sed
命令变成GNU
awk
方法:示例文件:
输出: