4

使用 AWK 增加日期

大家好,我需要你的帮助。我有一个文件“test.csv”,我想增加“6 个月”和“10 天”的日期,以便得到以下输出:

测试.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="date \"+%Y-%m-%d %T\" -d \""$3" +10 days\""; 命令 | 获取线基准;关闭(cmd);打印 $0 ",\""datum"\""}}' test.csv > test-increment-10days.csv

awk -F"\" ,\" " '{{ cmd="date \"+%Y-%m-%d %T\" -d \""$3" +6 个月\""; 命令 | 获取线基准;关闭(cmd);打印 $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"

测试增量 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”中的日期只增加一天,而“test-increment-6months.csv”中的日期只增加一个月。希望有人可以提供帮助。

4

3 回答 3

3

尝试这个:

awk -F"\",\"" '{cmd="date -d \"$(date -d \""$3"\")+10days\" \"+%Y-%m-%d %T\"";cmd | getline datum; close(cmd); print $0 ",\""datum"\""}' test.csv > test-increment-10days.csv

基础日期命令的一个示例是:

date -d "$(date -d '2013-05-07 16:02:07')+10days" "+%Y-%m-%d %T"

有两个date命令。内部date创建具有指定值的日期。然后再加10天。外部日期创建一个新的递增日期并对其进行格式化。

于 2013-06-05T09:33:28.547 回答
3

Here's one way using GNU awk. You will first need to convert your requirements into seconds. Alternatively, write some awk to do this. This should get you up and running:

awk -f script.awk test.csv

Contents of 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
}

Results:

"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"

Results:

"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 回答
0

Dogbane 的答案的替代版本,引用较少并使用简化的date结构将是

awk 'BEGIN {
    FPAT = "([^,]+)|(\"[^\"]+\")"
    OFS=","
}
{   
    gsub(/["]/,"",$3);
    cmd = "date -d \""$3" 10 days\" \"+%Y-%m-%d %I:%M:%S %p\"" 
}
{
    cmd|getline D; close(cmd);
    $3="\042"D"\042"
}1' file

并且 6 个月将是

awk 'BEGIN {
    FPAT = "([^,]+)|(\"[^\"]+\")"
    OFS=","
}
{   
    gsub(/["]/,"",$3);
    cmd = "date -d \""$3" 6 months\" \"+%Y-%m-%d %I:%M:%S %p\"" 
}
{
    cmd|getline D; close(cmd);
    $3="\042"D"\042"
}1' file

所做的改进是:

  1. 在形成cmd日期计算的命令字符串时使用更少的引号,这使得getlineawk.
  2. 使用date -d<date-string> 10 days, 而不使用+操作符。
  3. 添加FPAT正则表达式构造以更严格地解析各个 CSV 字段。
于 2018-11-14T09:14:42.843 回答