【问题标题】:Generating Dates between two date ranges in AWK在 AWK 中的两个日期范围之间生成日期
【发布时间】:2014-05-06 12:38:47
【问题描述】:

我需要创建一个日期间隔之间的天数列表。 例如从 2001-01-01 到 2009-12-31:

2001-01-01
2001-01-02
2001-01-03
..
2009-12-29
2009-12-30
2009-12-31

我知道怎么做,但也许有人已经制作了脚本? 如果没有,我会制作这样一个脚本并上传,这样其他人在需要时就不会浪费时间了。

【问题讨论】:

  • 嗯,SO 的主要目的是帮助其他人解决他们已经尝试过但自己无法解决的问题。如果您想发布一些有用的东西,您应该从中提出一个问题,供其他人/您解决;或者干脆为自己创建一个博客。
  • 阅读您的 date 手册页。我会专门寻找-d 选项。
  • 这个问题似乎跑题了,因为它不是一个真正的问题。
  • 不能使用 bash,因为我在 Windows 7 中工作。但我可以使用 GnuWin32 中的 AWK。我很确定还有其他人需要这样的脚本,所以我认为让这个问题在这里存在是件好事。如果允许“两个给定日期之间的 bash 循环”,那么我认为也应该允许“两个给定日期之间的 AWK 循环”。

标签: date awk intervals


【解决方案1】:

我不知道GnuWin32的awk,但是如果有“mktime”和“strftime”这两个函数,可以试试下面的代码:

BEGIN {
  START_DATE="2001-02-01"
  END_DATE="2001-03-05"

  S2=START_DATE
  gsub("-"," ",S2)

  T=mktime(S2 " 01 00 00")
  if   (T<0)
     printf("%s is invalid.\n",START_DATE) >> "/dev/stderr"
  else
  {
     for(S=START_DATE; END_DATE>S ;T+=86440) print S=strftime("%F",T)
  }
}

关键是将开始日期转换为一个数字,表示自纪元以来的秒数,加上 86400 秒(一天或 24 x 60 x 60)并转换回 ISO 日期格式。

经过一些试验,我意识到 mktime() 函数承认错误的日期也很好(例如,2000-14-03)。

最好的问候

【讨论】:

  • 谢谢,很好用!我添加了“BEGIN {}”。使用以下行在 Windows 中运行脚本:“gawk -f generate-days.awk generate-days.awk > days.txt”
  • @Jdamian,mktime() 不承认错误的日期! gnu.org/software/gawk/manual/html_node/Time-Functions.html
  • @agripp,我在 CentOS 6.5 中测试了print mktime("2000 14 03 00 00 00"),没有报错
  • @Jdamian,好的,文档不是很清楚,我表达了自己的错误。例如,当月份的值为 -1 或 13 时,表示前一个月或后一个月。 print mktime("2000 14 03 00 00 00") == print mktime("2001 02 03 00 00 00")
猜你喜欢
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
  • 2019-08-25
  • 2023-03-30
  • 1970-01-01
  • 2012-07-09
  • 2012-05-23
  • 1970-01-01
相关资源
最近更新 更多