sed は特定のフィールド選択に基づいて行を削除します。

sed は特定のフィールド選択に基づいて行を削除します。

入力する:

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

出力:

coupon,11/2018,1

大きなファイルからmm / yearの11/2018行を削除したいです。$2

答え1

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

入力をコンマまたはスラッシュで区切って処理します。入力の2番目のフィールドは月になり、3番目のフィールドは年になります。

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

牛に似た一種の栄養awk方法:

サンプルファイル:

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

関連情報