環境はMac OS SierraのTerminal
例えば下記sample.jsonファイルがあったとして
[{"name": "Ann", "@age": 20},{"name": "Bob", "@age": 30},{"name": "Chris", "@age": 40}]
name
については下記コマンドで絞込できる
$ jq .[].name sample.json
"Ann"
"Bob"
"Chris"
が、@age
の部分はそのままでは駄目で、ダブルクォートで囲うだけではcompile errorが起きたので、さらにシングルクォートで囲ってやる必要がある
$ jq .[].@age sample.json
jq: error: syntax error, unexpected $end, expecting QQSTRING_START (Unix shell quoting issues?) at <top-level>, line 1:
.[].@age
jq: 1 compile error
$ jq .[]."@age" sample.json
jq: error: syntax error, unexpected $end, expecting QQSTRING_START (Unix shell quoting issues?) at <top-level>, line 1:
.[].@age
jq: 1 compile error
$ jq .[].'"@age"' sample.json
20
30
40
国勢調査のデータを絞込しようとしたら特殊記号が出てくる
データサイエンティスト養成読本 登竜門編のデータ前処理の基礎知識のところで人口調査データ取得の部分
(データは書籍通り提供データ | 政府統計の総合窓口(e-Stat)−API機能からAPIを使うことでJSONデータを持ってこれる)
データ列が多すぎるのと、jqコマンドで絞込などできるということで
jqコマンドでjsonデータを整形・絞り込み - Qiita
国勢調査の結果で興味のある部分(TITLE)を抜粋しようとしてjqコマンドを使って絞込してみたところ
下記まで絞り込んだところで "@no"
と "$"
が出てきて詰まった
$ jq .GET_STATS_LIST.DATALIST_INF.TABLE_INF[].TITLE census.json | head -n 10
{
"@no": "00101",
"$": "男女の別(性別)(3),年齢5歳階級(23),人口 全国・市部・郡部・都道府県(47),全域・人口集中地区の別"
}
{
"@no": "00102",
"$": "男女の別(性別)(3),年齢各歳階級(103),人口 全国・市部・郡部・都道府県(47),全域・人口集中地区の別"
}
{
"@no": "002",
jqコマンドのマニュアルをみてみると
developmentバージョンでは特殊記号が出てくる時はダブルクォートを使って必要なら大カッコで囲ってねみたいなことが書いてあって
jq Manual (development version)
最新のreleaseバージョンではダブルクォートで囲ってねみたいなことが書いてあるが
compile errorがでてうまくいかなかった
$ jq .GET_STATS_LIST.DATALIST_INF.TABLE_INF[].TITLE."@no" census.json | head -n 5
jq: error: syntax error, unexpected $end, expecting QQSTRING_START (Unix shell quoting issues?) at <top-level>, line 1:
.GET_STATS_LIST.DATALIST_INF.TABLE_INF[].TITLE.@no
jq: 1 compile error
$ jq .GET_STATS_LIST.DATALIST_INF.TABLE_INF[].TITLE.["@no"] census.json | head -n 5
jq: error: syntax error, unexpected '[', expecting FORMAT or QQSTRING_START (Unix shell quoting issues?) at <top-level>, line 1:
.GET_STATS_LIST.DATALIST_INF.TABLE_INF[].TITLE.[@no]
jq: 1 compile error
ので検索すると下記githubのissueが出てきて、さらにシングルクォート使うこと、みたいな感じだった
Accessing fields that contain a special character · Issue #140 · stedolan/jq
のでやってみるとうまくいった
$ jq .GET_STATS_LIST.DATALIST_INF.TABLE_INF[].TITLE.'"$"' census.json | head -n 5
"男女の別(性別)(3),年齢5歳階級(23),人口 全国・市部・郡部・都道府県(47),全域・人口集中地区の別"
"男女の別(性別)(3),年齢各歳階級(103),人口 全国・市部・郡部・都道府県(47),全域・人口集中地区の別"
"総人口・日本人(2),男女の別(性別)(2),年齢各歳階級(122),出生の月(5),人口 全国・市部・郡部・都道府県(47),全域・人口集中地区の別"
"総人口・日本人(2),男女の別(性別)(2),年齢各歳階級(86),配偶関係(5),15歳以上人口 全国・市部・郡部・都道府県(47),全域・人口集中地区の別"
"男女の別(性別)(3),年齢5歳階級(19),国籍(5),外国人数 全国・市部・郡部・都道府県(47),全域・人口集中地区の別"
$ jq .GET_STATS_LIST.DATALIST_INF.TABLE_INF[].TITLE.'"@no"' census.json | head -n 5
"00101"
"00102"
"002"
"004"
"005"
どうやら、基本的にはいつもシングルクォートで全体を囲ってやってもいいみたい
大カッコを使う方法もちろん大丈夫
例えば下記でもいける
$ jq '.GET_STATS_LIST.DATALIST_INF.TABLE_INF[].TITLE."$"' census.json | head -n 5
"男女の別(性別)(3),年齢5歳階級(23),人口 全国・市部・郡部・都道府県(47),全域・人口集中地区の別"
"男女の別(性別)(3),年齢各歳階級(103),人口 全国・市部・郡部・都道府県(47),全域・人口集中地区の別"
"総人口・日本人(2),男女の別(性別)(2),年齢各歳階級(122),出生の月(5),人口 全国・市部・郡部・都道府県(47),全域・人口集中地区の別"
"総人口・日本人(2),男女の別(性別)(2),年齢各歳階級(86),配偶関係(5),15歳以上人口 全国・市部・郡部・都道府県(47),全域・人口集中地区の別"
"男女の別(性別)(3),年齢5歳階級(19),国籍(5),外国人数 全国・市部・郡部・都道府県(47),全域・人口集中地区の別"
$ jq .GET_STATS_LIST.DATALIST_INF.TABLE_INF[].TITLE'["$"]' census.json | head -n 5
"男女の別(性別)(3),年齢5歳階級(23),人口 全国・市部・郡部・都道府県(47),全域・人口集中地区の別"
"男女の別(性別)(3),年齢各歳階級(103),人口 全国・市部・郡部・都道府県(47),全域・人口集中地区の別"
"総人口・日本人(2),男女の別(性別)(2),年齢各歳階級(122),出生の月(5),人口 全国・市部・郡部・都道府県(47),全域・人口集中地区の別"
"総人口・日本人(2),男女の別(性別)(2),年齢各歳階級(86),配偶関係(5),15歳以上人口 全国・市部・郡部・都道府県(47),全域・人口集中地区の別"
"男女の別(性別)(3),年齢5歳階級(19),国籍(5),外国人数 全国・市部・郡部・都道府県(47),全域・人口集中地区の別"
好きなやり方でやると良さそう
windowsは試してないので不明です、Linuxは同じかと思います