2019-02-13 2023-02-15Bash , CentOS , Linux , Ubuntu
はじめに 以下のエントリの続き。
前回は q
コマンドの導入とテストデータ作成( 年次別にみた出生数・率(人口千対)・出生性比及び合計特殊出生率 )まで。
今回は実際に q
コマンドでデータを操作してみます。
検証環境 単純なデータの出力 CSV ファイルを DB のテーブルと見直したクエリを実行することができます。
from
句に CSV ファイルを指定今回は各列がカンマ ( , ) で区切られているので、デリミタとして , を指定します。 $ q -d , "select * from mb010000-utf8.csv"
1899,1386981 ,713442,673539,32.0,105.9,.. .
1900,1420534 ,727916,692618,32.4,105.1,.. .
1901,1501591 ,769494,732097,33.9,105.1,.. .
1902,1510835 ,773296,737539,33.6,104.8,.. .
1903,1489816 ,763806,726010,32.7,105.2,.. .
1904,1440371 ,738230,702141,31.2,105.1,.. .
1905,1452770 ,735948,716822,31.2,102.7,.. .
1906,1394295 ,726155,668140,29.6,108.7,.. .
1907,1614472 ,818114,796358,34.0,102.7,.. .
1908,1662815 ,850209,812606,34.7,104.6,.. .
1909,1693850 ,863855,829995,34.9,104.1,.. .
1910,1712857 ,872779,840078,34.8,103.9,.. .
.. .( 省略) .. .
ダウンロードしてきたデータの最終列がよくわからない。なぜドット。。。
もともとのデータの 1〜9 行目を見る限り、列情報の意味は左から以下のようになっているようです。
西暦 総数 男 女 出生率 性比 ? 必要なカラム情報のみを出力 ( select cN
) 7 列目がよくわからないので、除外したい。q
コマンドでは、各列名は暗黙的に c1
, c2
, c3
... のように cN
という名前がつけられます。
$ q -d , "select c1, c2, c3, c4, c5, c6 from mb010000-utf8.csv"
1899,1386981 ,713442,673539,32.0,105.9
1900,1420534 ,727916,692618,32.4,105.1
1901,1501591 ,769494,732097,33.9,105.1
1902,1510835 ,773296,737539,33.6,104.8
1903,1489816 ,763806,726010,32.7,105.2
1904,1440371 ,738230,702141,31.2,105.1
1905,1452770 ,735948,716822,31.2,102.7
1906,1394295 ,726155,668140,29.6,108.7
1907,1614472 ,818114,796358,34.0,102.7
1908,1662815 ,850209,812606,34.7,104.6
1909,1693850 ,863855,829995,34.9,104.1
1910,1712857 ,872779,840078,34.8,103.9
.. .( 省略) .. .
見やすくなった。
10 件を表示 ( limit
) 100 年間のデータが出力されるので、コンソールが見切れる。
10 件だけを表示させてみます。
SQL の limit
が使える。
$ q -d , "select c1, c2, c3, c4, c5, c6 from mb010000-utf8.csv limit 10"
1899,1386981 ,713442,673539,32.0,105.9
1900,1420534 ,727916,692618,32.4,105.1
1901,1501591 ,769494,732097,33.9,105.1
1902,1510835 ,773296,737539,33.6,104.8
1903,1489816 ,763806,726010,32.7,105.2
1904,1440371 ,738230,702141,31.2,105.1
1905,1452770 ,735948,716822,31.2,102.7
1906,1394295 ,726155,668140,29.6,108.7
1907,1614472 ,818114,796358,34.0,102.7
1908,1662815 ,850209,812606,34.7,104.6
出生数上位 10 件を表示 ( order by
) 出生数( 2 列目 )が多い年を上位 10 件表示させてみます。
SQL の order by
が使えます。
意外にも第二次世界大戦前後の出生率が高いですね。
逆に下位 10 件を表示してみます。
最近はめっきり少子化。
データの集計値を表示 ( count
/ sum
/ avg
) データは結局何件あったっけ?データ件数を確認してみます。
出生率( 5 列目 )の最大、最小を表示してみます。
最大と最小の値が大きく異なりますね。
平均も出せる。
データの加工( substr
) 10 年ごとの出生数の合計を表示してみます。
わかりやすいカラム名を指定する( alias ) ヘッダー行があれば、ヘッダー行の情報をカラム名として指定できます。
データの絞り込み( where
) 2005 年以降のデータのみを確認することができます。
$ q -d , "select * from mb010000-utf8.csv where c1 >= 2005"
2005,1062530 ,545032,517498,8.4,105.3,1.26
2006,1092674 ,560439,532235,8.7,105.3,1.32
2007,1089818 ,559847,529971,8.6,105.6,1.34
2008,1091156 ,559513,531643,8.7,105.2,1.37
2009,1070036 ,548994,521042,8.5,105.4,1.37
2010,1071305 ,550743,520562,8.5,105.8,1.39
2011,1050807 ,538271,512536,8.3,105.0,1.39
2012,1037232 ,531781,505451,8.2,105.2,1.41
2013,1029817 ,527657,502160,8.2,105.1,1.43
2014,1003609 ,515572,488037,8.0,105.6,1.42
2015,1005721 ,515468,490253,8.0,105.1,1.45
2016,977242 ,502012,475230,7.8,105.6,1.44
(おまけ)標準入力を食わせる ファイルではなく標準入力からデータを食わせることもできます。
$ cat mb010000-utf8.csv| q -d , "select * from -"
1899,1386981 ,713442,673539,32.0,105.9,.. .
1900,1420534 ,727916,692618,32.4,105.1,.. .
1901,1501591 ,769494,732097,33.9,105.1,.. .
1902,1510835 ,773296,737539,33.6,104.8,.. .
1903,1489816 ,763806,726010,32.7,105.2,.. .
1904,1440371 ,738230,702141,31.2,105.1,.. .
1905,1452770 ,735948,716822,31.2,102.7,.. .
1906,1394295 ,726155,668140,29.6,108.7,.. .
1907,1614472 ,818114,796358,34.0,102.7,.. .
1908,1662815 ,850209,812606,34.7,104.6,.. .
1909,1693850 ,863855,829995,34.9,104.1,.. .
1910,1712857 ,872779,840078,34.8,103.9,.. .
.. .( 省略) .. .
(おまけ)表示データを整形して表示 カンマ区切りのままだと数値の桁数によって、データが不揃いになり見にくいときがあります。
-b
オプションを付与すると、多少きれいに調整し出力してくれます。
$ q -d , -b "select * from mb010000-utf8.csv where c1 >= 2005"
2005,1062530 ,545032,517498,8.4,105.3,1.26
2006,1092674 ,560439,532235,8.7,105.3,1.32
2007,1089818 ,559847,529971,8.6,105.6,1.34
2008,1091156 ,559513,531643,8.7,105.2,1.37
2009,1070036 ,548994,521042,8.5,105.4,1.37
2010,1071305 ,550743,520562,8.5,105.8,1.39
2011,1050807 ,538271,512536,8.3,105.0,1.39
2012,1037232 ,531781,505451,8.2,105.2,1.41
2013,1029817 ,527657,502160,8.2,105.1,1.43
2014,1003609 ,515572,488037,8.0,105.6,1.42
2015,1005721 ,515468,490253,8.0,105.1,1.45
2016,977242 ,502012,475230,7.8,105.6,1.44
出力形式をタブ区切りに変更すると更に見やすくなります。
-T
オプションを付与します。
(おまけ)カンマを含むデータ、ダブルクォートを含むデータの取扱い カンマを含んだデータの取り扱いにも触れておきましょう。
CSV フォーマットでは、カンマ (,
) やダブルクォーテーション("
)を含むデータを扱うときには注意が必要です。
カンマ (,
)を含んだ列はダブルクォート("
)で囲む必要があります ダブルクォーテーション("
)を含んだ列はダブルクォートを連続で2つ(""
)記述する必要があります 上記のようなデータを q
コマンドでは正しく扱うことができるでしょうか?
試してみます。
カンマを含んだデータも正しく取り扱うことができました。
不要なダブルクォートを除外し、実際のデータを確認したい場合には -W none
オプションを付与します。
ひとこと CSV操作機能だけでも便利ですが、SQLで操作できるという素晴らしさ。
ディスカッション
コメント一覧
まだ、コメントがありません