次の形式のJSONストリームがあるとします。
{ "a": 10, "b": 11 } { "a": 20, "b": 21 } { "a": 30, "b": 31 }
各オブジェクトの値を合計して、単一のオブジェクトを出力します。
{ "a": 60, "b": 63 }
これはおそらく、上記のオブジェクトのリストを[name, value]
ペアの配列にフラット化し、reduce
を使用して値を合計する必要があると思いますが、reduce
を使用する構文のドキュメントは面倒です。
Jqにinputs
がない限り、-s
フラグを使用してオブジェクトをスラップする必要があります。次に、かなりの量の操作を行う必要があります。
map(to_entries)
| add
| group_by(.key)
| map({
key: .[0].key,
value: map(.value) | add
})
| from_entries
Jq 1.5では、これは大幅に改善される可能性があります。丸呑みを廃止して、inputs
を直接読み取るだけで済みます。
$ jq -n '
reduce (inputs | to_entries[]) as {$key,$value} ({}; .[$key] += $value)
' input.json
各オブジェクトのすべての値を単純に累積しているため、すべての入力のキーと値のペアを実行し、それらをすべて追加する方が簡単です。
Jqのパワーを非常によく示す別のアプローチは、次のように定義された「sum」という名前のフィルターを使用することです。
def sum(f): reduce .[] as $row (0; . + ($row|f) );
手元にある特定の問題を解決するには、-s
(--Slurp)オプションを上記のように、式と一緒に:
{"a": sum(.a), "b": sum(.b) } # (2)
(2)というラベルの付いた式は、指定された2つの合計のみを計算しますが、一般化するのは簡単です。次のように:
# Produce an object with the same keys as the first object in the
# input array, but with values equal to the sum of the corresponding
# values in all the objects.
def sumByKey:
. as $in
| reduce (.[0] | keys)[] as $key
( {}; . + {($key): ($in | sum(.[$key]))})
;
GitHubからすべてのアーティファクトをリストするときに同じ質問に直面し(詳細は here を参照)、それらのサイズを合計したいと思います。
curl https://api.github.com/repos/:owner/:repo/actions/artifacts \
-H "Accept: application/vnd.github.v3+json" \
-H "Authorization: token <your_pat_here>" \
| jq '.artifacts | map(.size_in_bytes) | add'
入力:
{
"total_count": 3,
"artifacts": [
{
"id": 0000001,
"node_id": "MDg6QXJ0aWZhY3QyNzUxNjI1",
"name": "artifact-1",
"size_in_bytes": 1,
"url": "https://api.github.com/repos/:owner/:repo/actions/artifacts/2751625",
"archive_download_url": "https://api.github.com/repos/:owner/:repo/actions/artifacts/2751625/Zip",
"expired": false,
"created_at": "2020-03-10T18:21:23Z",
"updated_at": "2020-03-10T18:21:24Z"
},
{
"id": 0000002,
"node_id": "MDg6QXJ0aWZhY3QyNzUxNjI0",
"name": "artifact-2",
"size_in_bytes": 2,
"url": "https://api.github.com/repos/:owner/:repo/actions/artifacts/2751624",
"archive_download_url": "https://api.github.com/repos/:owner/:repo/actions/artifacts/2751624/Zip",
"expired": false,
"created_at": "2020-03-10T18:21:23Z",
"updated_at": "2020-03-10T18:21:24Z"
},
{
"id": 0000003,
"node_id": "MDg6QXJ0aWZhY3QyNzI3NTk1",
"name": "artifact-3",
"size_in_bytes": 3,
"url": "https://api.github.com/repos/docker/mercury-ui/actions/artifacts/2727595",
"archive_download_url": "https://api.github.com/repos/:owner/:repo/actions/artifacts/2727595/Zip",
"expired": false,
"created_at": "2020-03-10T08:46:08Z",
"updated_at": "2020-03-10T08:46:09Z"
}
]
}
出力:
6