LoginSignup
4
3

JSONオブジェクトの並びから連結された配列を得る(jq コマンド利用)

Last updated at Posted at 2018-05-20

こんにちは
jqで連続するオブジェクトを配列にする」 で紹介されている --slurp/-s オプションを使い、オブジェクトの並び(JSONL形式)を受け取って処理してみました。

ここでオブジェクトの並びとは、

$ echo "1 2 3" | jq -c '.' | echo $(tr '\n' ' ')
1 2 3

--slurp/-s オプションを使い、これを配列化すると、

$ echo "1 2 3" | jq -s -c '.' 
[1,2,3]
$ echo [1] [2,3,[4]] | jq -s -c '.'
[[1],[2,3,[4]]]
$ man jq
--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.

'[]' で [] の中身を取り出すと(一番外の [] を外すと)、元のオブジェクトの並びへ戻ります。

$ echo [1] [2,3,[4]] | jq -s -c '.[]' | echo $(tr '\n' ' ')
[1] [2,3,[4]]

配列を連結など

また、--slurp/-s オプションを使い、配列を連結するには、add を使います。

$ echo [1] [2,3,[4]] | jq -s -c add
[1,2,3,[4]]

オブジェクトも連結(マージ)できます。

$ gzcat a.json.gz b.json.gz n.json.gz
{"a":1}
{"b":2}
{}
$ gzcat a.json.gz b.json.gz c.json.gz | jq -s -c add
{"a":1,"b":2}

フラットな配列を得るには、flatten を使います。

$ echo [1] [2,3,[4]] | jq -s -c flatten
[1,2,3,4]

オブジェクトの並びの処理:

$ echo "1 2 3" | jq -c '[.]' | echo $(tr '\n' ' ')
[1] [2] [3]
$ echo "[1,2,3]" | jq -c '.[]' | echo $(tr '\n' ' ')
1 2 3
4
3
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
4
3