2013-03-25 15 views
7

Mam lista numerów tygodniowo wydobytych z ogromnego pliku dziennika, były uzyskiwane przy użyciu składni:Data UNIX: Jak przekonwertować numer tygodnia na zakres dat (pon-nie)?

$ date --date="Wed Mar 20 10:19:56 2012" +%W; 
12 

Chcę stworzyć prostą funkcję bash, które można przekształcić te numery tygodniu do zakresu dat. Przypuszczam, że funkcja powinna przyjąć 2 argumenty: $ numerycznych i $ rocznie, przykład:

$ week() { ......... } 
$ number=12; year=2012 
$ week $number $year 
"Mon Mar 19 2012" - "Sun Mar 25 2012" 

Odpowiedz

9

Z GNU date:

$ cat weekof.sh 
function weekof() 
{ 
    local week=$1 year=$2 
    local week_num_of_Jan_1 week_day_of_Jan_1 
    local first_Mon 
    local date_fmt="+%a %b %d %Y" 
    local mon sun 

    week_num_of_Jan_1=$(date -d $year-01-01 +%W) 
    week_day_of_Jan_1=$(date -d $year-01-01 +%u) 

    if ((week_num_of_Jan_1)); then 
     first_Mon=$year-01-01 
    else 
     first_Mon=$year-01-$((01 + (7 - week_day_of_Jan_1 + 1))) 
    fi 

    mon=$(date -d "$first_Mon +$((week - 1)) week" "$date_fmt") 
    sun=$(date -d "$first_Mon +$((week - 1)) week + 6 day" "$date_fmt") 
    echo "\"$mon\" - \"$sun\"" 
} 

weekof $1 $2 
$ bash weekof.sh 12 2012 
"Mon Mar 19 2012" - "Sun Mar 25 2012" 
$ bash weekof.sh 1 2018 
"Mon Jan 01 2018" - "Sun Jan 07 2018" 
$ 
+0

Perfect !! Dziękuję Ci bardzo. – hellish

0

Jeśli ktoś potrzebuje go: Znalazłem jeszcze krótszą drogę (nie wiem, czy łatwiej) :

function weekof() { 
     local year=$2 
     local week=`echo $1 | sed 's/^0*//'` # Fixes random bug 
     local dateFormat="+%a %b %d %Y" 
     # Offset is the day of week, so we can calculate back to monday 
     local offset="`date -d "$year/01/01 +$((week - 1)) week" "+%u"`" 
     echo -n "`date -d "$year/01/01 +$((week - 1)) week +$((1 - $offset)) day" "$dateFormat"`" # Monday 
     echo -n " - " 
     echo "`date -d "$year/01/01 +$((week - 1)) week +$((7 - $offset)) day" "$dateFormat"`" # Sunday } 

Biorę pierwszy dzień roku i idę n tygodni do przodu, aby być gdzieś w odpowiednim tygodniu. Następnie biorę mój dzień powszedni i cofam się/przewijam do przodu, aby dotrzeć do poniedziałku i niedzieli.

+0

Twoje "weekof 12 2012" wyjściowe 'Mon Mar 12 2012 - Sun Mar 18 2012'. Powinno to być "Mon Mar 19 2012 - Sun Mar 25 2012". – pynexj

1

Jeżeli początek tygodnia jest niedziela, można użyć tej wersji weekof:

function weekof() 
{ 
    local week=$1 year=$2 
    local week_num_of_Jan_1 week_day_of_Jan_1 
    local first_Sun 
    local date_fmt="+%Y-%m-%d" 
    local sun sat 

    week_num_of_Jan_1=$(date -d $year-01-01 +%U) 
    week_day_of_Jan_1=$(date -d $year-01-01 +%u) 

    if ((week_num_of_Jan_1)); then 
     first_Sun=$year-01-01 
    else 
     first_Sun=$year-01-$((01 + (7 - week_day_of_Jan_1))) 
    fi 

    sun=$(date -d "$first_Sun +$((week - 1)) week" "$date_fmt") 
    sat=$(date -d "$first_Sun +$((week - 1)) week + 6 day" "$date_fmt") 
    echo "$sun $sat" 
} 
1

poniedziałek jest pierwszym dniem tygodnia, ISO week numbers:

function week2date() { 
    local year=$1 
    local week=$2 
    local dayofweek=$3 
    date -d "$year-01-01 +$(($week * 7 + 1 - $(date -d "$year-01-04" +%w) - 3)) days -2 days + $dayofweek days" +"%Y-%m-%d" 
} 

week2date 2017 35 1 
week2date 2017 35 7 

wyjściowa:

2017-08-28 
2017-09-03 
+0

Ta odpowiedź została już udzielona 4 lata temu. Jaką wartość dodaną daje Twoja odpowiedź? –

+0

1. skierowany numery tygodniu ISO wyraźnie 2. Wykorzystuje algorytm opisany w Wikipedii 3. To jest krótszy –

+0

Dobra, dość fair! –