特定の列と特定のパターンで行を取得する方法は?

特定の列と特定のパターンで行を取得する方法は?

次の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
  1. NF最後のフィールド、$NF値、$(NF-1)最後のフィールドの前のフィールド値など
  2. $NF日、月、年$(NF-1)$(NF-2)

関連情報