日付列が1ヶ月未満のファイルのすべてのレコードを取得する

日付列が1ヶ月未満のファイルのすべてのレコードを取得する

入力ファイル

ID,Name,join_date
21433432,rds,2014_02_01
2131321,ABCDS,2014-10-20
2432745314,ASRER, 2015-01-20
2132432423,safdsad, 2015-12-30

2つのファイルを生成する必要があります。 1つは、日付列が1ヶ月未満、6ヶ月未満のレコード用です。

出力ファイル1は1ヶ月未満です。

ID,name,join_date
2432745314,ASRER, 2015-01-20
2132432423,safdsad, 2015-12-30

出力ファイル2が6ヶ月未満です。

2131321,ABCDS,2014-10-20

コマンドを使用しましたがawk機能しませんでした。

答え1

これは始めるのに役立ちます。時間関数を実装するにはGNU awkが必要です。

gawk -F, '
    function totime(ymd) {gsub(/[-_]/," ",ymd); return mktime(ymd " 0 0 0")}
    BEGIN {now = systime(); m1 = now - 86400 * 30; m6 = now - 86400 * 180}
    FNR == 1 {next}
    {t = totime($3)}
    t > m1 {print "m1", $0; next}
    t > m6 {print "m6", $0}
' file
m6 2131321,ABCDS,2014-10-20
m1 2432745314,ASRER, 2015-01-20
m1 2132432423,safdsad, 2015-12-30

正確に1ヶ月6ヶ月ではなく、30日180日、夏時間の切り替えによる1時間プラスマイナス1時間

答え2

date内部コマンドを使用し、awkいくつかの条件に応じて出力を目的のファイルにリダイレクトするだけです。print

awk -F, 'BEGIN{ "date -d\"month ago\" +%s" | getline T1; close("date"); 
  "date -d\"6 months ago\" +%s" | getline T6; close("date")}
  { "date -d" $3 " +%s" | getline t; close("date"); 
  if(t>T1){print $0>"file2";next} if(t>T6)print $0>"file3"}' file

重要なのは、コマンドを使用して日付形式を1970年以降の秒に変換することですdate -d ... "+%s"。残りは自明でなければなりません。

関連情報