次のCSVファイルがあります。 (2列目は日付パターンです。)
qqq.eee,2015-10-12
rrr-ttt,2015-11-23
aaapppp,2022-01-10
ddd_fff,2017-05-23
zzzbbbb,2013-09-20
nnnmmmm,2015-06-17
wwwwwww,2014-11-20
uuu-uuu,2016-12-10
ppppppp,2015-10-19
kkkkkkk,2016-12-25
次のように、2番目の列で一致する行を取得したいと思います。
year between two number(for example): 2014<= year =<2016
month between two number(for example): 10<= month =<12
day between two number(for example): 20<= day =<30
次に、次のように出力を取得します。
rrr-ttt,2015-11-23
wwwwwww,2014-11-20
kkkkkkk,2016-12-25
awkを使ってこれを達成できますか?
答え1
awk
列および多条件フィルタリングに最適です。ただし、この特定の問題は次の方法で解決することもできます。grep
$ grep -E '201[4-6]-1[0-2]-(2[0-9]|30)$' ip.csv
rrr-ttt,2015-11-23
wwwwwww,2014-11-20
kkkkkkk,2016-12-25
-E
拡張正規表現の使用201[4-6]
2014~2016年の範囲1[0-2]
範囲は10〜12です。2[0-9]
範囲は20〜29です。- グループ化とシフトを使用して
(2[0-9]|30)
20〜30の範囲を提供します。
- グループ化とシフトを使用して
$
行末- 追加資料:http://www.regular-expressions.info/numericranges.html
答え2
区切り記号のため、終わりから始まりまで比較することになりますね。
awk -F[-,] '$NF >= 20 && $NF <= 30 && $(NF-1) >= 10 &&
$(NF-1) <= 12 && $(NF-2) >= 2014 && $(NF-2) <= 2016' yourfile
NF
最後のフィールド、$NF
値、$(NF-1)
最後のフィールドの前のフィールド値など$NF
日、月、年$(NF-1)
$(NF-2)