如何使用 BASH 脚本的 AWK 生成给定开始和结束日期的日期序列?
我有一个具有以下格式的数据集
第一个和第二个字段表示研究开始和结束的日期 (M/D/YYYY)。
如何使用 AWK 或 BASH 脚本将数据扩展为所需的输出格式,同时考虑到闰年?
非常感谢您的帮助。
输入
7/2/2009 7/7/2009
2/28/1996 3/3/1996
12/30/2001 1/4/2002
期望输出
7/7/2009
7/6/2009
7/5/2009
7/4/2009
7/3/2009
7/2/2009
3/3/1996
3/2/1996
3/1/1996
2/29/1996
2/28/1996
1/4/2002
1/3/2002
1/2/2002
1/1/2002
12/31/2001
12/30/2001
I have a data set with the following format
The first and second fields denote the dates (M/D/YYYY) of starting and ending of a study.
How one expand the data into the desired output format, taking into account the leap years using AWK or BASH scripts?
Your help is very much appreciated.
Input
7/2/2009 7/7/2009
2/28/1996 3/3/1996
12/30/2001 1/4/2002
Desired Output
7/7/2009
7/6/2009
7/5/2009
7/4/2009
7/3/2009
7/2/2009
3/3/1996
3/2/1996
3/1/1996
2/29/1996
2/28/1996
1/4/2002
1/3/2002
1/2/2002
1/1/2002
12/31/2001
12/30/2001
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
我更喜欢 ISO 8601 格式的日期 - 这是使用它们的解决方案。
如果您愿意,您可以轻松地将其改编为美国格式。
AWK 脚本
调用此文件:dates.awk
数据
调用此文件:dates.txt
结果
执行的命令:
输出:
I prefer ISO 8601 format dates - here is a solution using them.
You can adapt it easily enough to American format if you wish.
AWK Script
Call this file: dates.awk
Data
Call this file: dates.txt
Results
Command executed:
Output:
您可以将日期转换为 unix 时间戳,然后对其进行排序,如果需要,您甚至可以具有纳秒的粒度(日期中带有
'%N'
)以下示例打印
2020- 的时间11-07 00:00:00
至2020-11-07 01:00:00
,间隔5 分钟
You can convert date to unix timestamp and then sequencing on it, you can even have granularity of nanoseconds if you want (with
'%N'
in date)The following example prints time from
2020-11-07 00:00:00
to2020-11-07 01:00:00
in intervals of5 minutes
单独使用 bash 可以很好地完成:
或使用管道:
It can be done nicely with bash alone:
or with pipes:
如果您有
gawk
:演示:
输出:
编辑:
上面的脚本对天的长度有一个天真的假设。这是一个小问题,但在某些情况下可能会产生意想不到的结果。这里至少有一个其他答案也有这个问题。据推测,减去(或添加)天数的
date
命令不存在此问题。有些答案要求您提前知道天数。
这是另一种有望解决这些问题的方法:
If you have
gawk
:Demonstration:
Output:
Edit:
The script above suffers from a naive assumption about the length of days. It's a minor nit, but it could produce unexpected results under some circumstances. At least one other answer here also has that problem. Presumably, the
date
command with subtracting (or adding) a number of days doesn't have this issue.Some answers require you to know the number of days in advance.
Here's another method which hopefully addresses those concerns:
您可以在不使用 awk 的 shell 中执行此操作,假设您有 GNU 日期(这是
date -d @nnn
形式所需要的,并且可能能够在个位数的日期和月份中去除前导零) :如果您所在的区域设置实行夏令时,那么如果请求中间发生夏令时切换的日期序列,这可能会变得混乱。使用 -u 强制使用 UTC,它也严格遵守每天 86400 秒。就像这样:
只需将您的输入提供给标准输入即可。
您的数据的输出是:
You can do this in the shell without awk, assuming you have GNU date (which is needed for the
date -d @nnn
form, and possibly the ability to strip leading zeros on single digit days and months):If you are in a locale that does daylight savings, then this can get messed up if requesting a date sequence where a daylight saving switch occurs in between. Use -u to force to UTC, which also strictly observes 86400 seconds per day. Like this:
Just feed this your input on stdin.
The output for your data is:
另一种选择是使用 dateutils 中的 dateeq (http://www.fresse.org/dateutils/#dateseq< /a>)。
-i
更改输入格式,-f
更改输出格式。当第一个日期晚于第二个日期时,-1
必须指定为增量。Another option is to use dateseq from dateutils (http://www.fresse.org/dateutils/#dateseq).
-i
changes the input format and-f
changes the output format.-1
must be specified as an increment when the first date is later than the second date.