jqコマンドで特殊記号を含むKeyの絞込はシングルクォートで囲う

環境はMac OS SierraのTerminal

例えば下記sample.jsonファイルがあったとして

```json: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
```


## 国勢調査のデータを絞込しようとしたら特殊記号が出てくる

[データサイエンティスト養成読本 登竜門編](http://gihyo.jp/book/2017/978-4-7741-8877-5)のデータ前処理の基礎知識のところで人口調査データ取得の部分
(データは書籍通り[提供データ | 政府統計の総合窓口(e-Stat)−API機能](http://www.e-stat.go.jp/api/api-data/)からAPIを使うことでJSONデータを持ってこれる)

データ列が多すぎるのと、jqコマンドで絞込などできるということで

[jqコマンドでjsonデータを整形・絞り込み - Qiita](http://qiita.com/Nakau/items/272bfd00b7a83d162e3a)

[シェル芸で使いたい jqイディオム - Qiita](http://qiita.com/nmrmsys/items/5b4a4bd2e3909db161b1)

[jq コマンドを使う日常のご紹介 - Qiita](http://qiita.com/takeshinoda@github/items/2dec7a72930ec1f658af)

国勢調査の結果で興味のある部分(TITLE)を抜粋しようとしてjqコマンドを使って絞込してみたところ

下記まで絞り込んだところで `"@no"` と `"$"` が出てきて詰まった

```
$ jq .GET_STATS_LIST.DATALIST_INF.TABLE_INF[].TITLE census.json | head -n 10

{
  "@no": "00101",
  "$": "男女の別（性別）（３），年齢５歳階級（２３），人口 全国・市部・郡部・都道府県（４７），全域・人口集中地区の別"
}
{
  "@no": "00102",
  "$": "男女の別（性別）（３），年齢各歳階級（１０３），人口 全国・市部・郡部・都道府県（４７），全域・人口集中地区の別"
}
{
  "@no": "002",
```




jqコマンドのマニュアルをみてみると

developmentバージョンでは特殊記号が出てくる時はダブルクォートを使って必要なら大カッコで囲ってねみたいなことが書いてあって

[jq Manual (development version)](https://stedolan.github.io/jq/manual/#Basicfilters)

最新のreleaseバージョンではダブルクォートで囲ってねみたいなことが書いてあるが

[jq 1.5 Manual](https://stedolan.github.io/jq/manual/v1.5/#Basicfilters)

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](https://github.com/stedolan/jq/issues/140#issuecomment-178849018)

のでやってみるとうまくいった

```
$ jq .GET_STATS_LIST.DATALIST_INF.TABLE_INF[].TITLE.'"$"' census.json | head -n 5

"男女の別（性別）（３），年齢５歳階級（２３），人口 全国・市部・郡部・都道府県（４７），全域・人口集中地区の別"
"男女の別（性別）（３），年齢各歳階級（１０３），人口 全国・市部・郡部・都道府県（４７），全域・人口集中地区の別"
"総人口・日本人（２），男女の別（性別）（２），年齢各歳階級（１２２），出生の月（５），人口 全国・市部・郡部・都道府県（４７），全域・人口集中地区の別"
"総人口・日本人（２），男女の別（性別）（２），年齢各歳階級（８６），配偶関係（５），１５歳以上人口 全国・市部・郡部・都道府県（４７），全域・人口集中地区の別"
"男女の別（性別）（３），年齢５歳階級（１９），国籍（５），外国人数 全国・市部・郡部・都道府県（４７），全域・人口集中地区の別"

$ 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

"男女の別（性別）（３），年齢５歳階級（２３），人口 全国・市部・郡部・都道府県（４７），全域・人口集中地区の別"
"男女の別（性別）（３），年齢各歳階級（１０３），人口 全国・市部・郡部・都道府県（４７），全域・人口集中地区の別"
"総人口・日本人（２），男女の別（性別）（２），年齢各歳階級（１２２），出生の月（５），人口 全国・市部・郡部・都道府県（４７），全域・人口集中地区の別"
"総人口・日本人（２），男女の別（性別）（２），年齢各歳階級（８６），配偶関係（５），１５歳以上人口 全国・市部・郡部・都道府県（４７），全域・人口集中地区の別"
"男女の別（性別）（３），年齢５歳階級（１９），国籍（５），外国人数 全国・市部・郡部・都道府県（４７），全域・人口集中地区の別"


$ jq .GET_STATS_LIST.DATALIST_INF.TABLE_INF[].TITLE'["$"]' census.json | head -n 5
"男女の別（性別）（３），年齢５歳階級（２３），人口 全国・市部・郡部・都道府県（４７），全域・人口集中地区の別"
"男女の別（性別）（３），年齢各歳階級（１０３），人口 全国・市部・郡部・都道府県（４７），全域・人口集中地区の別"
"総人口・日本人（２），男女の別（性別）（２），年齢各歳階級（１２２），出生の月（５），人口 全国・市部・郡部・都道府県（４７），全域・人口集中地区の別"
"総人口・日本人（２），男女の別（性別）（２），年齢各歳階級（８６），配偶関係（５），１５歳以上人口 全国・市部・郡部・都道府県（４７），全域・人口集中地区の別"
"男女の別（性別）（３），年齢５歳階級（１９），国籍（５），外国人数 全国・市部・郡部・都道府県（４７），全域・人口集中地区の別"
```

好きなやり方でやると良さそう

windowsは試してないので不明です、Linuxは同じかと思います