jq
doc
日本語訳があるので、これを一読 よく読むのが良い。jqは慣れないと???になるので。
以下の解説がとても親切
カンマは配列やオブジェクトの要素を区切るものとしてシンタックスが用意されているのでは無く、フィルタの入力処理を分ける意味で
この部分、ぼんやりとやり過ごしていた
こちらもよい。
tutorial
現在 version1.6
s
tips
JSONを相手にしているか、JSONのnewline付き?を相手にしているかを見る。
--slurp/-sを使う。
instead of running the filter for each JSON object in the input, read the entire input stream into a large array and run the filter just once.
特定の要素に絞りたい. select( 対象要素|test("値") を使う
$ lshw -json | jq '.children[]|select( .id| test("core"))|.children[]│|select(.id|test("cpu"))'
特定の要素を排除したい。del()を使う
$ del(要素)
複数列を出力したい -> 文字列で出力
"\(.foo) \(.bar)"
"() ()"と文字列化して出力する。(csv化したい場合は....簡易にはデータ型がstringの時は "をescapeすればよい) (はescapeしないといけない。
commandline上なので、編集がやりにくいが、、
join()を使う
csvにする
@csvは、配列を受けるので [.foo, .bar]|@csv
@csvは、nullで、空白要素?を出力する
要素数が同じでなくても、出力されるが、実用的には同じ要素数にしたい。
length, if then else の使用
とりあえず配列にして、@csvで出すといろいろ見やすいかも。
ある条件でselectしたobjectのpropertyを変更して、全体を返す
=を使う
|=なども、概念を理解しておかないと...冒頭の jqのマニュアルの翻訳をよく読む
nameがDay4の typeを hogeDayが変える。
$ cat hoge.json |jq '(.[]|select(.name == "Day4").type)= "hogeDay"'
階層データの処理. 配列が入ってるデータの取り出し
以下の手順。
.url as $urlで上層?のurlを変数にアサイン。
.items|.[].propertiesで配列含む下層に降りる
()で文字列にして、output
その後は、grep, sedでごにょごにょ。。。
$ cat out20171027.jl |jq '.url as $url|.items|.[].properties| "\($url) \(.[].itemkey) \(.[].itemvalue)"'|grep " price 0-9" |sed 's/"//g; s/ /,/g' > ../site-price-20171027.csv to_entries, from_entries, with_entries
arrayで[ {key: xxx, value:yyy}, {key:x, value:y}] の形をentriesと呼んでる。
通常のobjectを、to_entriesにすると、この形に変えることができ、keyが keyとvalueなオブジェクトのarrayになる。
メリット?
useful for doing some operation to all keys and values of an object.
with_entriesを使ってる。
参考
parallelを使う: