某所で話題になってた『内閣府の「国民の祝日」CSV』をシェル芸で加工して見やすくする

なんか、某所で見にくい・加工しにくいと話題になってた『内閣府の「国民の祝日」CSV』について、シェル芸を使って加工して少し見やすくしたので備忘として残しておく(使うことはないだろうけど)。 このデータ、確かにそのままだと扱いにくいけど加工自体はそこまで難易度の高いものではないみたい。 コンソール上で見やすくするため、CSVではなくTSVにして出力してみる(CSVにしたきゃ、awkのとこにある「\t」を「,」に変えればいいだけだし)。

以下、Linuxで実行できるコマンド。 文字コード・改行コードの変換にnkfコマンドが必要になるので、環境にインストールしておくこと。

curl -s http://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv | nkf -Luw | sed '1,3d;$d;s/,/ /g' | xargs -n2 | sort -Vk2 | awk '{print $2"\t"$1}'

blacknon@BS-PUB-DEVELOP:~$ curl -s http://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv | nkf -Luw | sed '1,3d;$d;s/,/ /g' | xargs -n2 | sort -Vk2 | awk '{print $2"\t"$1}'
2016/1/11       成人の日
2016/2/11       建国記念の日
2016/3/20       春分の日
2016/4/29       昭和の日
2016/5/3        憲法記念日
2016/5/4        みどりの日
2016/5/5        こどもの日
2016/7/18       海の日
2016/8/11       山の日
2016/9/19       敬老の日
2016/9/22       秋分の日
2016/10/10      体育の日
2016/11/3       文化の日
2016/11/23      勤労感謝の日
2016/12/23      天皇誕生日
2017/1/9        成人の日
2017/2/11       建国記念の日
2017/3/20       春分の日
2017/4/29       昭和の日
2017/5/3        憲法記念日
2017/5/4        みどりの日
2017/5/5        こどもの日
2017/7/17       海の日
2017/8/11       山の日
2017/9/18       敬老の日
2017/9/23       秋分の日
2017/10/9       体育の日
2017/11/3       文化の日
2017/11/23      勤労感謝の日
2017/12/23      天皇誕生日
2018/1/8        成人の日
2018/2/11       建国記念の日
2018/3/21       春分の日
2018/4/29       昭和の日
2018/5/3        憲法記念日
2018/5/4        みどりの日
2018/5/5        こどもの日
2018/7/16       海の日
2018/8/11       山の日
2018/9/17       敬老の日
2018/9/23       秋分の日
2018/10/8       体育の日
2018/11/3       文化の日
2018/11/23      勤労感謝の日
2018/12/23      天皇誕生日

せっかくなので、日付に曜日もつけてみる。

curl -s http://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv | nkf -Luw | sed '1,3d;$d;s/,/ /g' | xargs -n2 | sort -Vk2 | awk '{c="date -d \""$2"\" +%a";c|getline t;print $2"("t")\t"$1}'

blacknon@BS-PUB-DEVELOP:~$ curl -s http://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv | nkf -Luw | sed '1,3d;$d;s/,/ /g' | xargs -n2 | sort -Vk2 | awk '{c="date -d \""$2"\" +%a";c|getline t;print $2"("t")\t"$1}'
2016/1/11(月)   成人の日
2016/2/11(木)   建国記念の日
2016/3/20(日)   春分の日
2016/4/29(金)   昭和の日
2016/5/3(火)    憲法記念日
2016/5/4(水)    みどりの日
2016/5/5(木)    こどもの日
2016/7/18(月)   海の日
2016/8/11(木)   山の日
2016/9/19(月)   敬老の日
2016/9/22(木)   秋分の日
2016/10/10(月)  体育の日
2016/11/3(木)   文化の日
2016/11/23(水)  勤労感謝の日
2016/12/23(金)  天皇誕生日
2017/1/9(月)    成人の日
2017/2/11(土)   建国記念の日
2017/3/20(月)   春分の日
2017/4/29(土)   昭和の日
2017/5/3(水)    憲法記念日
2017/5/4(木)    みどりの日
2017/5/5(金)    こどもの日
2017/7/17(月)   海の日
2017/8/11(金)   山の日
2017/9/18(月)   敬老の日
2017/9/23(土)   秋分の日
2017/10/9(月)   体育の日
2017/11/3(金)   文化の日
2017/11/23(木)  勤労感謝の日
2017/12/23(土)  天皇誕生日
2018/1/8(月)    成人の日
2018/2/11(日)   建国記念の日
2018/3/21(水)   春分の日
2018/4/29(日)   昭和の日
2018/5/3(木)    憲法記念日
2018/5/4(金)    みどりの日
2018/5/5(土)    こどもの日
2018/7/16(月)   海の日
2018/8/11(土)   山の日
2018/9/17(月)   敬老の日
2018/9/23(日)   秋分の日
2018/10/8(月)   体育の日
2018/11/3(土)   文化の日
2018/11/23(金)  勤労感謝の日
2018/12/23(日)  天皇誕生日

…なんか嫌な予感がする。 曜日を少し加工しやすいようにして、集計してみよう。

# 曜日をタブ区切りで2列目にする
curl -s http://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv | nkf -Luw | sed '1,3d;$d;s/,/ /g' | xargs -n2 | sort -Vk2 | awk '{c="date -d \""$2"\" +%a";c|getline t;print $2"\t"t"曜日\t"$1}'

# 更に曜日別集計(わかりやすいよう改行入れる)
curl -s http://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv \
| nkf -Luw | sed '1,3d;$d;s/,/ /g' | xargs -n2 | sort -Vk2 | awk '{c="date -d \""$2"\" +%a";c|getline t;print $2"\t"t"曜日\t"$1}' \
| awk -F'[/\t]' '{print $1" "$4}' | sort | uniq -c | grep -E -e '^.*[土,日]曜日' -e $

blacknon@BS-PUB-DEVELOP:~$ curl -s http://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv | nkf -Luw | sed '1,3d;$d;s/,/ /g' | xargs -n2 | sort -Vk2 | awk '{c="date -d \""$2"\" +%a";c|getline t;print $2"\t"t"曜日\t"$1}'
2016/1/11       月曜日  成人の日
2016/2/11       木曜日  建国記念の日
2016/3/20       日曜日  春分の日
2016/4/29       金曜日  昭和の日
2016/5/3        火曜日  憲法記念日
2016/5/4        水曜日  みどりの日
2016/5/5        木曜日  こどもの日
2016/7/18       月曜日  海の日
2016/8/11       木曜日  山の日
2016/9/19       月曜日  敬老の日
2016/9/22       木曜日  秋分の日
2016/10/10      月曜日  体育の日
2016/11/3       木曜日  文化の日
2016/11/23      水曜日  勤労感謝の日
2016/12/23      金曜日  天皇誕生日
2017/1/9        月曜日  成人の日
2017/2/11       土曜日  建国記念の日
2017/3/20       月曜日  春分の日
2017/4/29       土曜日  昭和の日
2017/5/3        水曜日  憲法記念日
2017/5/4        木曜日  みどりの日
2017/5/5        金曜日  こどもの日
2017/7/17       月曜日  海の日
2017/8/11       金曜日  山の日
2017/9/18       月曜日  敬老の日
2017/9/23       土曜日  秋分の日
2017/10/9       月曜日  体育の日
2017/11/3       金曜日  文化の日
2017/11/23      木曜日  勤労感謝の日
2017/12/23      土曜日  天皇誕生日
2018/1/8        月曜日  成人の日
2018/2/11       日曜日  建国記念の日
2018/3/21       水曜日  春分の日
2018/4/29       日曜日  昭和の日
2018/5/3        木曜日  憲法記念日
2018/5/4        金曜日  みどりの日
2018/5/5        土曜日  こどもの日
2018/7/16       月曜日  海の日
2018/8/11       土曜日  山の日
2018/9/17       月曜日  敬老の日
2018/9/23       日曜日  秋分の日
2018/10/8       月曜日  体育の日
2018/11/3       土曜日  文化の日
2018/11/23      金曜日  勤労感謝の日
2018/12/23      日曜日  天皇誕生日
blacknon@BS-PUB-DEVELOP:~$
blacknon@BS-PUB-DEVELOP:~$ # 更に曜日別集計(わかりやすいよう改行入れる)
blacknon@BS-PUB-DEVELOP:~$ curl -s http://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv \
> | nkf -Luw | sed '1,3d;$d;s/,/ /g' | xargs -n2 | sort -Vk2 | awk '{c="date -d \""$2"\" +%a";c|getline t;print $2"\t"t"曜日\t"$1}' \
> | awk -F'[/\t]' '{print $1" "$4}' | sort | uniq -c | grep -E -e '^.*[土,日]曜日' -e $
      1 2016 火曜日
      2 2016 金曜日
      4 2016 月曜日
      2 2016 水曜日
      <span style="color: #ff0000;">1 2016 日曜日</span>
      5 2016 木曜日
      3 2017 金曜日
      5 2017 月曜日
      1 2017 水曜日
      <span style="color: #ff0000;">4 2017 土曜日</span>
      2 2017 木曜日
      2 2018 金曜日
      4 2018 月曜日
      1 2018 水曜日
      <span style="color: #ff0000;">3 2018 土曜日</span>
      <span style="color: #ff0000;">4 2018 日曜日</span>
      1 2018 木曜日

…2016年、とても恵まれた奇跡の年だったのですね。

2017年の祝日が結構土曜日と被ってるのは知ってたけど、まさか来年もとは…。 悲しい…。 日曜は振替になるからいいけど、土曜日も振替休日欲しいなぁ。

あと、大晦日って国民の祝日じゃないんだ。知らなかった。

で、今回はこの程度のデータ量や難易度、更にあんまり使わなそうなデータだったからいいけど、これと同じことをもっと重要、かつ大きなデータとかでやられるのはどうかなと思う。 これ、文字コードや改行コードから推測するとWindowsで作ったんじゃないかな(高い確率でExcelから生成されてる気がする)。正直、データとしてはよろしい…とは言えないので、次は改善して欲しいなぁと。