こんにちは
「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