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