Jq: 簡単な例

作成日 2015年04月30日  ·  4コメント  ·  ソース: stedolan/jq

クールなツール、これを使い始めるのに苦労しています。 ここでこの簡単な質問をする方が速いかもしれません:

私はこれを持っています:
[
{{
「タイトル」:「シンガポール」、
「値」:5
}、
{{
「タイトル」:「中国」、
「値」:2
}、
{{
「タイトル」:「シンガポール」、
「値」:7
}
]

これ欲しい:
[
{{
「タイトル」:「シンガポール」、
「値」:12
}、
{{
「タイトル」:「中国」、
「値」:2
}
]

これを減らす方法は?

support

最も参考になるコメント

group_by(.title) | map({"title": .[0].title, value: map(.value) | add})

これにより、配列の要素がタイトルでグループ化され、グループごとに、グループの要素のタイトルとグループの要素の値の合計を含むオブジェクトが生成されます。

全てのコメント4件

group_by(.title) | map({"title": .[0].title, value: map(.value) | add})

これにより、配列の要素がタイトルでグループ化され、グループごとに、グループの要素のタイトルとグループの要素の値の合計を含むオブジェクトが生成されます。

魅力のように働いた:)

これは、「reduce」を明示的に使用するわずかに異なるアプローチです。 タイトルがすべて文字列であるという事実を利用します。このため、「sort」(「group_by」によって実行される)を必要としないという点でより効率的です。

簡単に言うと、(タイトル、合計値)のペアを持つ単一のオブジェクトを作成し、それを目的の形式に変換します。

{"Singapore":12、 "China":2}などのオブジェクトをタイトル値オブジェクトの配列に変換する関数は次のとおりです。

def objects(key; value): . as $in | reduce keys[] as $key ([]; . + [{ (key): $key, (value): $in[$key] }]);

タスクを実行するために、次のように書くことができます。

reduce .[] as $x ({}; . +  { ($x.title): ($x.value + (.[$x.title] )) })
  | objects("title"; "value")

別の方法は次のとおりです。

group_by(.title)|.[] | reduce .[] as $item (null; .title = $item.title | .value |= . + $item.value)

これは各グループを減らし、グループ内の各アイテムのタイトルを保持し(タイトルでグループ化したため、常に同じである必要があります)、値を追加します。 これは、数値へのnullの加算が数値へのゼロの加算と同じであることに依存しますが、その依存関係を削除することもできます。

group_by(.title)|.[] | reduce .[] as $item ({}; .title = $item.title | .value |= (.//0) + $item.value)

これから素敵な小さな関数を作ることができます:

def group_reduce(group_by_exp; reduction_exp):
  group_by(group_by_exp) | .[] | reduce .[] as $item ({}; (group_by_exp) = ($item | group_by_exp) | [., $item] | reduction_exp);

group_reduce(.title; (.[1] as $right|.[0]|.value |= (. + $right.value)))
このページは役に立ちましたか?
0 / 5 - 0 評価