4

AWK で日付をインクリメントする

こんにちは、私はあなたの助けが必要です。ファイル「test.csv」があり、「6 か月」と「10 日」の日付を増やして、次の出力を得たいと考えています。

test.csv:

"000001","TEST1","2013-05-07 16:02:07","ACTIVE"
"000003","TEST3","2013-05-09 16:02:07","ACTIVE"
"000004","TEST4","2013-05-10 16:02:07","ACTIVE"
"000005","TEST5","2013-05-11 12:02:07","ACTIVE"

出力 test-increment-10days.csv:

"000001","TEST1","2013-05-07 16:02:07","ACTIVE","2013-05-17 16:02:07"
"000003","TEST3","2013-05-09 16:02:07","ACTIVE","2013-05-19 16:02:07"
"000004","TEST4","2013-05-10 16:02:07","ACTIVE","2013-05-20 16:02:07"
"000005","TEST5","2013-05-11 12:02:07","ACTIVE","2013-05-21 12:02:07"

出力 test-increment-6months.csv:

"000001","TEST1","2013-05-07 16:02:07","ACTIVE","2013-11-07 16:02:07"
"000003","TEST3","2013-05-09 16:02:07","ACTIVE","2013-11-09 16:02:07"
"000004","TEST4","2013-05-10 16:02:07","ACTIVE","2013-11-10 16:02:07"
"000005","TEST5","2013-05-11 12:02:07","ACTIVE","2013-11-11 12:02:07"

私はこのコマンドでそれを試しました:

awk -F"\" ,\" " '{{ cmd="日付 \"+%Y-%m-%d %T\" -d \""$3" +10 日\""; コマンド | getline データム; 閉じる (cmd); print $0 ",\""datum"\""}}' test.csv > test-increment-10days.csv

awk -F"\" ,\" " '{{ cmd="日付 \"+%Y-%m-%d %T\" -d \""$3" +6 か月\""; コマンド | getline データム; 閉じる (cmd); print $0 ",\""datum"\""}}' test.csv > test-increment-6months.csv

しかし、私はこの間違った出力を得ています。

テスト増分-10days.csv:

"000001","TEST1","2013-05-07 16:02:07","ACTIVE","2013-05-08 16:02:07"
"000003","TEST3","2013-05-09 16:02:07","ACTIVE","2013-05-10 16:02:07"
"000004","TEST4","2013-05-10 16:02:07","ACTIVE","2013-05-11 16:02:07"
"000005","TEST5","2013-05-11 12:02:07","ACTIVE","2013-05-12 12:02:07"

test-increment-6months.csv:

"000001","TEST1","2013-05-07 16:02:07","ACTIVE","2013-06-07 16:02:07"
"000003","TEST3","2013-05-09 16:02:07","ACTIVE","2013-06-09 16:02:07"
"000004","TEST4","2013-05-10 16:02:07","ACTIVE","2013-06-10 16:02:07"
"000005","TEST5","2013-05-11 12:02:07","ACTIVE","2013-06-11 12:02:07"

「test-increment-10days.csv」の日付は 1 日だけ増分され、「test-increment-6months.csv」の日付は 1 か月だけ増分されます。誰かが助けてくれることを願っています。

4

3 に答える 3

3

を使用する 1 つの方法を次に示しGNU awkます。まず、要件を秒に変換する必要があります。あるいは、これを行うためにいくつか書いawkてください。これで起動して実行できるはずです:

awk -f script.awk test.csv

の内容script.awk:

BEGIN {
    FPAT = "([^,]+)|(\"[^\"]+\")"
    OFS=","
}

{
    string = "\"(....)-(..)-(..) (..):(..):(..)\""
    format = "\\1 \\2 \\3 \\4 \\5 \\6"

    date_spec = gensub(string, format, "", $3)
    timestamp = mktime(date_spec)

    # 10 days = 864000 seconds
    # 6 months = 15638400 seconds

    # uncomment one of the following:
#   new_stamp = "\"" strftime("%F %T", timestamp + 864000) "\""
#   new_stamp = "\"" strftime("%F %T", timestamp + 15638400) "\""

    print $0, new_stamp
}

結果:

"000001","TEST1","2013-05-07 16:02:07","ACTIVE","2013-05-17 16:02:07"
"000003","TEST3","2013-05-09 16:02:07","ACTIVE","2013-05-19 16:02:07"
"000004","TEST4","2013-05-10 16:02:07","ACTIVE","2013-05-20 16:02:07"
"000005","TEST5","2013-05-11 12:02:07","ACTIVE","2013-05-21 12:02:07"

結果:

"000001","TEST1","2013-05-07 16:02:07","ACTIVE","2013-11-04 16:02:07"
"000003","TEST3","2013-05-09 16:02:07","ACTIVE","2013-11-06 16:02:07"
"000004","TEST4","2013-05-10 16:02:07","ACTIVE","2013-11-07 16:02:07"
"000005","TEST5","2013-05-11 12:02:07","ACTIVE","2013-11-08 12:02:07"
于 2013-06-05T10:17:59.110 に答える