【问题标题】:Increment date with AWK for few days and months使用 AWK 增加日期几天和几个月
【发布时间】:2013-05-31 21:57:06
【问题描述】:

使用 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="date \"+%Y-%m-%d %T\" -d \""$3" + 10天\””;命令 |获取线基准;关闭(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

但我得到了错误的输出。

test-increment-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”中的日期只增加一天,而“test-increment-6months.csv”中的日期只增加一个月。希望有人能帮忙。

【问题讨论】:

    标签: linux unix date csv awk


    【解决方案1】:

    试试这个:

    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天。外部日期创建一个新的递增日期并对其进行格式化。

    【讨论】:

      【解决方案2】:

      这是使用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"
      

      【讨论】:

      • +1 很好地使用了 FPAT 和内置函数。虽然由于 FPAT,但适用于 GAWK 版本 4 或更高版本。
      【解决方案3】:

      dogbane's answer 的替代版本使用较少的引用并使用简化的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 时使用更少的引号,这使得在awkgetline 函数中使用起来更加优雅。
      2. 使用date -d<date-string> 10 days,而不使用+ 运算符。
      3. 添加 FPAT 正则表达式构造,以更严格地解析各个 CSV 字段。

      【讨论】:

        猜你喜欢
        • 2016-11-04
        • 1970-01-01
        • 2021-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多