Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何为过去n周生成连续的周范围日期_Bash_Date_Awk - Fatal编程技术网

Bash 如何为过去n周生成连续的周范围日期

Bash 如何为过去n周生成连续的周范围日期,bash,date,awk,Bash,Date,Awk,我想生成一个n周范围的日期列表,从当前一周向后,如下所示 2014-03-22 2014-03-28 2014-03-15 2014-03-21 2014-03-08 2014-03-14 etc. 其中每行中的第一个日期是周周期的开始,周周期从周六开始,到周五结束 我的首选是使用awk或其他Unix工具在shell脚本中执行此操作。字段分隔符无关紧要,但记录应为每行一条 n=5 for i in $(seq 0 $((n-1))); do echo "$(date -d "l

我想生成一个n周范围的日期列表,从当前一周向后,如下所示

2014-03-22 2014-03-28
2014-03-15 2014-03-21
2014-03-08 2014-03-14
etc.
其中每行中的第一个日期是周周期的开始,周周期从周六开始,到周五结束

我的首选是使用awk或其他Unix工具在shell脚本中执行此操作。字段分隔符无关紧要,但记录应为每行一条

n=5    
for i in $(seq 0 $((n-1))); do
    echo "$(date -d "last saturday -$i weeks" +"%Y-%m-%d") $(date -d "friday -$i weeks" +"%Y-%m-%d")"; 
done
输出:

2014-03-22 2014-03-28
2014-03-15 2014-03-21
2014-03-08 2014-03-14
2014-03-01 2014-03-07
2014-02-22 2014-02-28
输出:

2014-03-22 2014-03-28
2014-03-15 2014-03-21
2014-03-08 2014-03-14
2014-03-01 2014-03-07
2014-02-22 2014-02-28

您可能可以使用从epoch开始的以秒为单位的时间来执行此操作

date +%s
将显示自1970年1月1日起经过的当前秒数

查看一周中的当前日期和日期,减去一天中的86400秒*X到达上一个星期六的天数

以秒为单位打印该数字我们将使用'date'命令中的输出/格式修饰符将其称为'foo',打印foo+86400*7,下一个星期五为3月28日

然后,将之前的周数打印为N周数是一个数学问题,将-86400或7*-86400应用于自epoch以来经过的更新时间


如果您想使用shell,可能有更好的方法,但我想到的第一件事是。

您可能可以使用epoch中以秒为单位的时间来执行此操作

date +%s
将显示自1970年1月1日起经过的当前秒数

查看一周中的当前日期和日期,减去一天中的86400秒*X到达上一个星期六的天数

以秒为单位打印该数字我们将使用'date'命令中的输出/格式修饰符将其称为'foo',打印foo+86400*7,下一个星期五为3月28日

然后,将之前的周数打印为N周数是一个数学问题,将-86400或7*-86400应用于自epoch以来经过的更新时间


可能有更好的方法,但如果您想使用shell,我想到的第一件事是。

如果GNU日期是个问题,那么Perl呢?对于最新版本的Perl,应该只使用标准模块

use v5.10;
use Time::Piece;
use Time::Seconds;

$, = " ";

# get the previous saturday, unless today is saturday
my $day = localtime;
$day -= $day->wday * ONE_DAY unless $day->wday == 6;

while (1) {
    say $day->strftime("%F"), ($day + 6*ONE_DAY)->strftime("%F"); 
    $day -= 7 * ONE_DAY;
}

如果GNU日期是个问题,那么Perl呢?对于最新版本的Perl,应该只使用标准模块

use v5.10;
use Time::Piece;
use Time::Seconds;

$, = " ";

# get the previous saturday, unless today is saturday
my $day = localtime;
$day -= $day->wday * ONE_DAY unless $day->wday == 6;

while (1) {
    say $day->strftime("%F"), ($day + 6*ONE_DAY)->strftime("%F"); 
    $day -= 7 * ONE_DAY;
}

哇…我不知道你可以和date一起做。POSIX date没有-d-date=STRING特性。是否很难调整您的脚本,使其不使用GNU的-date=STRING?是的,上面的脚本在很大程度上依赖于能否使用该功能。我认为awk可能是你最好的选择,除非你想遵循@Anthony的建议并使用大量shell算法。没关系,我可以通过自制coreutilsGood one在OS X上安装gnu date!请注意,您正在使用上周六和周五。这取决于你一周中的哪一天,它可能会给你带来一些问题。我会投票。。。但昨天已经做到了:哇……我不知道你能用date做到这一点。POSIX date没有-d-date=STRING特性。是否很难调整您的脚本,使其不使用GNU的-date=STRING?是的,上面的脚本在很大程度上依赖于能否使用该功能。我认为awk可能是你最好的选择,除非你想遵循@Anthony的建议并使用大量shell算法。没关系,我可以通过自制coreutilsGood one在OS X上安装gnu date!请注意,您正在使用上周六和周五。这取决于你一周中的哪一天,它可能会给你带来一些问题。我会投票。。。但昨天已经做到了: