labunix's blog

labunixのラボUnix

年間カレンダーのcalとbash。CSV出力する。

■年間カレンダー calとbash。
 縦表示の年間カレンダーが欲しいという相談をたまに受けるけど、calでいいじゃん。

$ for m in `seq 1 12`;do MYCAL="2014/$m";cal -d $MYCAL;done
      12014         
日 月 火 水 木 金 土  
          1  2  3  4  
 5  6  7  8  9 10 11  
12 13 14 15 16 17 18  
19 20 21 22 23 24 25  
26 27 28 29 30 31     
                      
      22014         
日 月 火 水 木 金 土  
                   1  
 2  3  4  5  6  7  8  
 9 10 11 12 13 14 15  
16 17 18 19 20 21 22  
23 24 25 26 27 28     
                      
      32014         
日 月 火 水 木 金 土  
                   1  
 2  3  4  5  6  7  8  
 9 10 11 12 13 14 15  
16 17 18 19 20 21 22  
23 24 25 26 27 28 29  
30 31                 
      42014         
日 月 火 水 木 金 土  
       1  2  3  4  5  
 6  7  8  9 10 11 12  
13 14 15 16 17 18 19  
20 21 22 23 24 25 26  
27 28 29 30           
                      
      52014         
日 月 火 水 木 金 土  
             1  2  3  
 4  5  6  7  8  9 10  
11 12 13 14 15 16 17  
18 19 20 21 22 23 24  
25 26 27 28 29 30 31  
                      
      62014         
日 月 火 水 木 金 土  
 1  2  3  4  5  6  7  
 8  9 10 11 12 13 14  
15 16 17 18 19 20 21  
22 23 24 25 26 27 28  
29 30                 
                      
      72014         
日 月 火 水 木 金 土  
       1  2  3  4  5  
 6  7  8  9 10 11 12  
13 14 15 16 17 18 19  
20 21 22 23 24 25 26  
27 28 29 30 31        
                      
      82014         
日 月 火 水 木 金 土  
                1  2  
 3  4  5  6  7  8  9  
10 11 12 13 14 15 16  
17 18 19 20 21 22 23  
24 25 26 27 28 29 30  
31                    
      92014         
日 月 火 水 木 金 土  
    1  2  3  4  5  6  
 7  8  9 10 11 12 13  
14 15 16 17 18 19 20  
21 22 23 24 25 26 27  
28 29 30              
                      
      102014        
日 月 火 水 木 金 土  
          1  2  3  4  
 5  6  7  8  9 10 11  
12 13 14 15 16 17 18  
19 20 21 22 23 24 25  
26 27 28 29 30 31     
                      
      112014        
日 月 火 水 木 金 土  
                   1  
 2  3  4  5  6  7  8  
 9 10 11 12 13 14 15  
16 17 18 19 20 21 22  
23 24 25 26 27 28 29  
30                    
      122014        
日 月 火 水 木 金 土  
    1  2  3  4  5  6  
 7  8  9 10 11 12 13  
14 15 16 17 18 19 20  
21 22 23 24 25 26 27  
28 29 30 31           

■あるいは、自分でワンライナー書けばいいじゃん。

$ for y in `seq 1 12`;do
    MYCAL="2014/${y}/01"; \
    echo -e "\n       $MYCAL" | sed s%"/01"%%; \
    echo "       "; \
    n=`date -d "${MYCAL}" '+%u'`; \
    l=`date -d "${MYCAL} next month last day" '+%d'`; \
    if [ $n -ne 7 ];then \
      for s in `seq 1 $n`;do echo -n "0 ";done; \
    else \
      echo " "; \
    fi | \
    for d in `xargs` `seq 1 $l`;do \
      echo "$d $n" | \
        awk '{if(($1+$2)%7==0) printf "%3d\n",$1%32;else printf "%3d",$1%32}'; \
    done | sed s/" 0"/"  "/g;
    echo;unset n m MYCAL
  done
       2014/1
 日 月 火 水 木 金 土
           1  2  3  4
  5  6  7  8  9 10 11
 12 13 14 15 16 17 18
 19 20 21 22 23 24 25
 26 27 28 29 30 31

       2014/2
 日 月 火 水 木 金 土
                    1
  2  3  4  5  6  7  8
  9 10 11 12 13 14 15
 16 17 18 19 20 21 22
 23 24 25 26 27 28

       2014/3
 日 月 火 水 木 金 土
                    1
  2  3  4  5  6  7  8
  9 10 11 12 13 14 15
 16 17 18 19 20 21 22
 23 24 25 26 27 28 29
 30 31

       2014/4
 日 月 火 水 木 金 土
        1  2  3  4  5
  6  7  8  9 10 11 12
 13 14 15 16 17 18 19
 20 21 22 23 24 25 26
 27 28 29 30

       2014/5
 日 月 火 水 木 金 土
              1  2  3
  4  5  6  7  8  9 10
 11 12 13 14 15 16 17
 18 19 20 21 22 23 24
 25 26 27 28 29 30 31


       2014/6
 日 月 火 水 木 金 土
  1  2  3  4  5  6  7
  8  9 10 11 12 13 14
 15 16 17 18 19 20 21
 22 23 24 25 26 27 28
 29 30

       2014/7
 日 月 火 水 木 金 土
        1  2  3  4  5
  6  7  8  9 10 11 12
 13 14 15 16 17 18 19
 20 21 22 23 24 25 26
 27 28 29 30 31

       2014/8
 日 月 火 水 木 金 土
                 1  2
  3  4  5  6  7  8  9
 10 11 12 13 14 15 16
 17 18 19 20 21 22 23
 24 25 26 27 28 29 30
 31

       2014/9
 日 月 火 水 木 金 土
     1  2  3  4  5  6
  7  8  9 10 11 12 13
 14 15 16 17 18 19 20
 21 22 23 24 25 26 27
 28 29 30

       2014/10
 日 月 火 水 木 金 土
           1  2  3  4
  5  6  7  8  9 10 11
 12 13 14 15 16 17 18
 19 20 21 22 23 24 25
 26 27 28 29 30 31

       2014/11
 日 月 火 水 木 金 土
                    1
  2  3  4  5  6  7  8
  9 10 11 12 13 14 15
 16 17 18 19 20 21 22
 23 24 25 26 27 28 29
 30

       2014/12
 日 月 火 水 木 金 土
     1  2  3  4  5  6
  7  8  9 10 11 12 13
 14 15 16 17 18 19 20
 21 22 23 24 25 26 27
 28 29 30 31

■良く聞くと、大抵は「独自の年間カレンダーを作りたい。」らしい。
 「CSVで欲しい、エクセルやLibreOfficeのCalcで編集したい。」と。
 ふむ。上のワンライナーと大して変わらないよ。

$ for y in `seq 1 12`;do \
    MYCAL="2014/${y}/01"; \
    echo -e "\n       $MYCAL,,,,,," | sed s%"/01"%%; \
    echo ",,,,,,"; \
    n=`date -d "${MYCAL}" '+%u'`; \
    l=`date -d "${MYCAL} next month last day" '+%d'`; \
    if [ $n -ne 7 ];then \
      for s in `seq 1 $n`;do echo -n "0 ";done; \
    else \
      echo " "; \
    fi | \
    for d in `xargs` `seq 1 $l`;do \
      echo "$d $n" | \
        awk '{if(($1+$2)%7==0) printf "%3d\n",$1%32;else printf "%3d",$1%32}'; \
    done | sed s/" *\([0-9]*\)"/"\1,"/g | sed s/"^,"//g | sed s/",\$"//g | \
    sed s/"^,,"//g | sed s/"^0,"/","/g | sed s/",0"/","/g; \
    echo;unset n m MYCAL;   done

       2014/1,,,,,,
日,月,火,水,木,金,土
,,,1,2,3,4
5,6,7,8,9,10,11
12,13,14,15,16,17,18
19,20,21,22,23,24,25
26,27,28,29,30,31

       2014/2,,,,,,
日,月,火,水,木,金,土
,,,,,,1
2,3,4,5,6,7,8
9,10,11,12,13,14,15
16,17,18,19,20,21,22
23,24,25,26,27,28

       2014/3,,,,,,
日,月,火,水,木,金,土
,,,,,,1
2,3,4,5,6,7,8
9,10,11,12,13,14,15
16,17,18,19,20,21,22
23,24,25,26,27,28,29
30,31

       2014/4,,,,,,
日,月,火,水,木,金,土
,,1,2,3,4,5
6,7,8,9,10,11,12
13,14,15,16,17,18,19
20,21,22,23,24,25,26
27,28,29,30

       2014/5,,,,,,
日,月,火,水,木,金,土
,,,,1,2,3
4,5,6,7,8,9,10
11,12,13,14,15,16,17
18,19,20,21,22,23,24
25,26,27,28,29,30,31


       2014/6,,,,,,
日,月,火,水,木,金,土
1,2,3,4,5,6,7
8,9,10,11,12,13,14
15,16,17,18,19,20,21
22,23,24,25,26,27,28
29,30

       2014/7,,,,,,
日,月,火,水,木,金,土
,,1,2,3,4,5
6,7,8,9,10,11,12
13,14,15,16,17,18,19
20,21,22,23,24,25,26
27,28,29,30,31

       2014/8,,,,,,
日,月,火,水,木,金,土
,,,,,1,2
3,4,5,6,7,8,9
10,11,12,13,14,15,16
17,18,19,20,21,22,23
24,25,26,27,28,29,30
31

       2014/9,,,,,,
日,月,火,水,木,金,土
,1,2,3,4,5,6
7,8,9,10,11,12,13
14,15,16,17,18,19,20
21,22,23,24,25,26,27
28,29,30

       2014/10,,,,,,
日,月,火,水,木,金,土
,,,1,2,3,4
5,6,7,8,9,10,11
12,13,14,15,16,17,18
19,20,21,22,23,24,25
26,27,28,29,30,31

       2014/11,,,,,,
日,月,火,水,木,金,土
,,,,,,1
2,3,4,5,6,7,8
9,10,11,12,13,14,15
16,17,18,19,20,21,22
23,24,25,26,27,28,29
30

       2014/12,,,,,,
日,月,火,水,木,金,土
,1,2,3,4,5,6
7,8,9,10,11,12,13
14,15,16,17,18,19,20
21,22,23,24,25,26,27
28,29,30,31