LoginSignup
7
5

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-08-23

環境はMac OS SierraのTerminal

例えば下記sample.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

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

データサイエンティスト養成読本 登竜門編のデータ前処理の基礎知識のところで人口調査データ取得の部分
(データは書籍通り提供データ | 政府統計の総合窓口(e-Stat)−API機能からAPIを使うことでJSONデータを持ってこれる)

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

jqコマンドでjsonデータを整形・絞り込み - Qiita

シェル芸で使いたい jqイディオム - Qiita

jq コマンドを使う日常のご紹介 - 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バージョンではダブルクォートで囲ってねみたいなことが書いてあるが

jq 1.5 Manual

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は同じかと思います

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5