如何截取一年中每个月的第一个周日到周六?

sta*_*106 8 bash perl awk

我们有绿色区域逻辑,其中作业只能在第一个星期日到星期六之间运行,即从每个月的第一个星期日开始的 7 天。我正在使用下面的 awk 命令来获取它,但它在某处坏了。我只是在尝试前 3 个月,即 1 月到 3 月

seq 75  | awk ' BEGIN {ti=" 0 0 0"} 
function dtf(fmt,dy) { return strftime(fmt,mktime("2020 1 " dy ti)) } 
{ day=dtf("%A %F",$0);mm=dtf("%m",$0);if(day~/Sunday/ || a[mm]) a[mm]++ ; if(a[mm]<8) print day }  '
Run Code Online (Sandbox Code Playgroud)

我的输出如下,这是不正确的:

Wednesday 2020-01-01
Thursday 2020-01-02
Friday 2020-01-03
Saturday 2020-01-04
Sunday 2020-01-05
Monday 2020-01-06
Tuesday 2020-01-07
Wednesday 2020-01-08
Thursday 2020-01-09
Friday 2020-01-10
Saturday 2020-01-11
Saturday 2020-02-01
Sunday 2020-02-02
Monday 2020-02-03
Tuesday 2020-02-04
Wednesday 2020-02-05
Thursday 2020-02-06
Friday 2020-02-07
Saturday 2020-02-08
Sunday 2020-03-01
Monday 2020-03-02
Tuesday 2020-03-03
Wednesday 2020-03-04
Thursday 2020-03-05
Friday 2020-03-06
Saturday 2020-03-07
Run Code Online (Sandbox Code Playgroud)

预期输出:

Sunday 2020-01-05
Monday 2020-01-06
Tuesday 2020-01-07
Wednesday 2020-01-08
Thursday 2020-01-09
Friday 2020-01-10
Saturday 2020-01-11
Sunday 2020-02-02
Monday 2020-02-03
Tuesday 2020-02-04
Wednesday 2020-02-05
Thursday 2020-02-06
Friday 2020-02-07
Saturday 2020-02-08
Sunday 2020-03-01
Monday 2020-03-02
Tuesday 2020-03-03
Wednesday 2020-03-04
Thursday 2020-03-05
Friday 2020-03-06
Saturday 2020-03-07
Run Code Online (Sandbox Code Playgroud)

如何调整 awk 命令以获得预期输出?也欢迎使用其他 bash 工具的任何其他解决方案。

Soc*_*owi 6

我建议使用以下 awk 替代方法:

#! /usr/bin/env bash
for month in {01..03}; do
  for day in {01..13}; do
    date -d "2020-$month-$day" '+%A %F'
  done |
  grep -A6 -m1 -F Sunday
done
Run Code Online (Sandbox Code Playgroud)

该脚本效率不高,但可以完成工作。对于每个月,我们只打印该月前 13 天的日期。我们知道绿色区域必须在该区域内,因此我们不需要该月的剩余天数。
日期格式为Weekday YYYY-MM-DD. 我们使用grep查找并打印第一个星期日,打印该星期日后面的 6 天 ( -A6) 并退出,因为我们将搜索限制为一个匹配 ( -m1)。
对第 1 到第 3 个月中的每一个月执行上述过程。