Linux 需要得到一年中所有星期一的日期

Linux 需要得到一年中所有星期一的日期,linux,bash,shell,date,Linux,Bash,Shell,Date,我需要每周对数据进行排序,我所拥有的只是日志文件中的日期。 因此,为了整理每周的数据,我想创建一个列表,列出给定年份所有周一的日期。我试图解决一些问题,目前我唯一的想法是使用ncal,以年和月为参数,在所有月份循环,提取所有周一。难道没有更有效的方法吗?您可以使用日期获取当前周数。也许你可以这样分类: $ date +%W -d '2011-02-18' 07 要获取所有星期一,请获取所有日期并按星期一筛选: for i in `seq 0 365` do date -d "+$i d

我需要每周对数据进行排序,我所拥有的只是日志文件中的日期。
因此,为了整理每周的数据,我想创建一个列表,列出给定年份所有周一的日期。我试图解决一些问题,目前我唯一的想法是使用ncal,以年和月为参数,在所有月份循环,提取所有周一。难道没有更有效的方法吗?

您可以使用
日期
获取当前周数。也许你可以这样分类:

$ date +%W -d '2011-02-18'
07

要获取所有星期一,请获取所有日期并按星期一筛选:

for i in `seq 0 365`
    do date -d "+$i day"
done | grep Mon

当然,你也可以在周一继续增加7天。

希望这就是你的意思。可以更改以下内容以改变日期的输出格式

date命令可用于此,不知道ncal是否更高效

我知道你现在喜欢“binning”,但这里有一个更具可读性的v

$ cat /tmp/1.sh
#!/bin/bash

test -z "$year" && {
    echo "I expect you to set \$year environment variable"
    echo "In return I will display you the Mondays of this year"
    exit 1
}

# change me if you would like the date format to be different
# man date would tell you all the combinations you can use here
DATE_FORMAT="+%Y-%m-%d"

# change me if you change the date format above. I need to be
# able to extract the year from the date I'm shoing you
GET_YEAR="s/-.*//"

# this value is a week, in milliseconds. Changing it would change
# what I'm doing.
WEEK_INC=604800

# Use another 3-digit week day name here, to see dates for other week days
DAY_OF_WEEK=Mon

# stage 1, let's find us the first day of the week in this year

d=1
# is it DAY_OF_WEEK yet?
while test "$(date -d ${year}-1-${d} +%a)" != "$DAY_OF_WEEK"; do
# no, so let's look at the next day
    d=$((d+1));
done;

# let's ask for the milliseconds for that DAY_OF_WEEK that I found above
umon=$(date -d ${year}-1-${d} +%s)

# let's loop until we break from inside
while true; do
   # ndate is the date that we testing right now
   ndate=$(date -d @$umon "$DATE_FORMAT");
   # let's extract year
   ny=$(echo $ndate|sed "$GET_YEAR");
   # did we go over this year? If yes, then break out
   test $ny -ne $year && { break; }
   # move on to next week
   umon=$((umon+WEEK_INC))
   # display the date so far
   echo "$ndate"
done

无需迭代一年中的所有365或366天。以下命令最多执行71次
date

#!/bin/bash
y=2011

for d in {0..6}
do
    if (( $(date -d "$y-1-1 + $d day" '+%u') == 1))   # +%w: Mon == 1 also
    then
        break
    fi
done

for ((w = d; w <= $(date -d "$y-12-31" '+%j'); w += 7))
do
    date -d "$y-1-1 + $w day" '+%Y-%m-%d'
done

根据以上答案,我提出了另一个选择。现在可以指定开始和结束日期

#!/bin/bash

datestart=20110101
dateend=20111231

for tmpd in {0..6}
do
  date -d "$datestart $tmpd day" | grep -q Mon
  if [ $? = 0 ];
  then
    break
  fi
done

for ((tmpw = $tmpd; $(date -d "$datestart $tmpw day" +%s) <= $(date -d "$dateend" +%s); tmpw += 7))
do
  echo `date -d "$datestart $tmpw day" +%d-%b-%Y`
done
#/bin/bash
datestart=20110101
dateend=20111231
对于{0..6}中的tmpd
做
日期-d“$datestart$tmpd day”| grep-q Mon
如果[$?=0];
然后
打破
fi
完成

对于((tmpw=$tmpd;$(日期-d“$datestart$tmpw-day”+%s)谢谢,输出正是我想要的。理解是很复杂的。可读性是废话,你也应该考虑评论代码。-1,为什么,一个没有评论的内衬什么都不是一个好的解决方案,如果谁问这个问题,对你所做的事情一无所知。我已经删除了-1。@安德斯,我收到你的短信了。nt第二次提交完整版本时,为什么我没有想到这一点,我可以将日志文件中的日期转换为周数。
对于I in
seq 0 365
;do date-d“2011-1-1$I day”| grep-q Mon;如果[$?];那么date-d“2011-1-1$I day”+%Y-%m-%d;fi;完成
对不起没有工作应该是
中的i
序列0 365
;完成日期-d“2011-1-1$i天”| grep-q Mon;如果[$?=0];那么日期-d“2011-1-1$i天”++%Y-%m-%d;fi;done
这是一个可以在mac os x上运行的版本,它可以去除一周中可能不需要的一天:
对于'seq 0 365'中的i;do date-v+${i}d++%a%m-%d';done | sed-n“s/^Mon p///code>要通过递增而不是变大来完成,请找到偏移量,直到下周一(这里是3)然后:`seq 3 7 365`
等中的i的
错误。对于某些年份,最后一周将在下一年开始。偏移量错误地被同化到最后一节中的日期。更改
为((w=d;w
#!/bin/bash

datestart=20110101
dateend=20111231

for tmpd in {0..6}
do
  date -d "$datestart $tmpd day" | grep -q Mon
  if [ $? = 0 ];
  then
    break
  fi
done

for ((tmpw = $tmpd; $(date -d "$datestart $tmpw day" +%s) <= $(date -d "$dateend" +%s); tmpw += 7))
do
  echo `date -d "$datestart $tmpw day" +%d-%b-%Y`
done