代码之家  ›  专栏  ›  技术社区  ›  Til Hund

Bash-获取给定年份每个星期六的日期列表

  •  0
  • Til Hund  · 技术社区  · 5 年前

    bash macOS dates yyyymmdd 每年的每个星期六,并将其保存为变量。

    例如,如果我想要一个1850年所有周六的日期列表,它应该是这样的:

    var = [ 18500105, 18500112, 18500119, …, 18501228 ]
    

    使用以下代码:

    list=()
    for month in `seq -w 1 12`; do
        for day in `seq -w 1 31`; do
        list=( $(gdate -d "1850$month$day" '+%A %Y%m%d' | grep 'Saturday' | egrep -o '[[:digit:]]{4}[[:digit:]]{2}[[:digit:]]{2}' | tee /dev/tty) )
        done
    done
    

    但是,上面的命令不会在数组中写入任何内容 list 尽管它给了我正确的输出 tee .

    如何解决这些问题?

    0 回复  |  直到 5 年前
        1
  •  2
  •   Inian    5 年前

    修改 Dennis Williamson's answer 稍微适合您的需求,并将结果添加到数组中。在GNU上工作 date 而不是FreeBSD的版本。

    #!/usr/bin/env bash
    y=1850
    
    for d in {0..6}
    do
        # Identify the first day of the year that is a Saturday and break out of
        # the loop
        if (( $(date -d "$y-1-1 + $d day" '+%u') == 6))
        then
            break
        fi
    done
    
    array=()
    # Loop until the last day of the year, increment 7 days at a
    # time and append the results to the array
    for ((w = d; w <= $(date -d "$y-12-31" '+%j'); w += 7))
    do
        array+=( $(date -d "$y-1-1 + $w day" '+%Y%m%d') )
    done
    

    printf '%s\n' "${array[@]}"
    

    建立GNU 日期 在MacOS上你需要做 brew install coreutils 并以 gdate 以区别于提供的本机版本。

        2
  •  2
  •   Ole Tange    5 年前

    date .

    我会把答案留给其他没有这个限制的人,但这对你不起作用。

    这不是你想要的,但很接近:

    year=1850
    firstsat=$(date -d $year-01-01-$(date -d $year-01-01 +%w)days+6days +%Y%m%d)
    parset a 'date -d '$firstsat'+{=$_*=7=}days +%Y%m%d' ::: {0..52}
    echo ${a[@]}
    

    它有一个缺陷,它发现了接下来的53个星期六,最后一个可能不在今年。

    parset 是GNU并行的一部分。

        3
  •  1
  •   Paul Hodges    5 年前


    以星期几和目标年份作为论据。

    获取当天中午的纪元秒- 只要年份与请求的匹配,就将该日期添加到数组中,并将一周的秒数添加到跟踪变量中。

    $: typeset -f alldays
    alldays () { local dow=$1 year=$2 julian=1;
      until [[ "$dow" == "$( date +%a -d $year-01-0$julian )" ]]; do (( julian++ )); done;
      es=$( date +%s -d "12pm $year-01-0$julian" );
      allhits=( $( while [[ $year == "$( date +%Y -d @$es )" ]]; do date +%Y%m%d -d @$es; (( es+=604800 )); done; ) )
    }
    $: time alldays Sat 1850
    real    0m9.931s
    user    0m1.025s
    sys     0m6.695s
    
    $: printf "%s\n" "${allhits[@]}"
    18500105
    18500112
    18500119
    18500126
    18500202
    18500209
    18500216
    18500223
    18500302
    18500309
    18500316
    18500323
    18500330
    18500406
    18500413
    18500420
    18500427
    18500504
    18500511
    18500518
    18500525
    18500601
    18500608
    18500615
    18500622
    18500629
    18500706
    18500713
    18500720
    18500727
    18500803
    18500810
    18500817
    18500824
    18500831
    18500907
    18500914
    18500921
    18500928
    18501005
    18501012
    18501019
    18501026
    18501102
    18501109
    18501116
    18501123
    18501130
    18501207
    18501214
    18501221
    18501228