2017-02-02 8 views
2

レッツはjqでデカルト積を作るには?

echo '[{"a": 1, "b": 2}, {"a": 3, "b": 4}]' | jq '[{x: .[].a, y: .[].b}]' 

、私は入力

[ 
    { 
     "a":1, 
     "b":2 
    }, 
    { 
     "a":3, 
     "b":4 
    } 
] 

を持っていると私が試したと言うと私は私が出力を必要とする、アレイ内のすべての項目のために必要な意味

[ 
    { 
     "x":1, 
     "b":2, 
     "language":"en" 
    }, 
    { 
     "x":1, 
     "b":2, 
     "language":"fr" 
    }... 
] 

を取得したいと思い2つのアイテムには、"lanuage": "en"キー値のペアが1つあり、1つに"lanuage": "ru"

EDIT。もしそれが明確でないなら、enoug。オブジェクトの入力配列isと別の配列xsのケテシアン積が必要です。これは私に(i, x)のペアを与えます。それぞれのペアに対して、xの値を持つiと私の場合はいくつかのキー(language)のすべて(キー、値)のペアを持つオブジェクトを出力したいと思います。

答えて

1

一般に、複数の値を生成する式は、複数の値を生成する別の式と組み合わされて、デカルト積を作成します。

即ち、

"\(1,2) \(3,4)" 

ストリング"1 3""2 3""1 4"、及び"2 4"を生成します。

同じ値の配列を指定できます。 []は配列を受け取り、各項目の結果を生成します。

$ jq --argjson langs '["en","fr"]' '[(.[]|{x:.a,b}) + {language:$langs[]}]' input.json 

しかし、これはさらに単純に減らすことができます:あなたはこのような何かを行うことができ、これらの概念を組み合わせたこれは作品をalmostsが、無効なJSONを出力

$ jq --argjson langs '["en","fr"]' '[.[]|{x:.a,b,language:$langs[]}]' input.json 

または

$ jq --argjson langs '["en","fr"]' 'map({x:.a,b,language:$langs[]})' input.json 
+0

私は配列が必要です。どうやってするか? – user1685095

+0

これはjsonオブジェクトのストリームです。ストリームを配列として必要とする場合は、大括弧を追加して配列に格納するだけです。 –

+0

さて、私はこの 'echo '[{" a ":1、" b ":2}、{" a ":3、" b ":4}]'を試しました。 jq --argjson langs '["en"、 "fr"]' '。[] | [{x:.a、y:.b、language:$ langs []}] ''。これにより配列のストリームが作成されます。 – user1685095

関連する問題