2017-08-31 4 views
1

私は以下のようなjsonを持っています。私は各タイマーレコードの1行を含む出力を取得したいが、サービスの名前が含まれています。私は期待していた出力がjqは親で配列の各値を取得します

[["Test Value","08/30/2017 16:33:35","625"],["Test Value","08/30/2017 16:22:38","240"]] 
[["Test Value 2","08/30/2017 16:07:38","432"],["Test Value 2","08/30/2017 15:59:07","1355"]] 

ことしかし、値は両方のために重複していることに気付くだろう私に

[["Test Value","08/30/2017 16:33:35","625"],["Test Value","08/30/2017 16:22:38","240"]] 
[["Test Value","08/30/2017 16:07:38","432"],["Test Value","08/30/2017 15:59:07","1355"]] 
[["Test Value 2","08/30/2017 16:33:35","625"],["Test Value 2","08/30/2017 16:22:38","240"]] 
[["Test Value 2","08/30/2017 16:07:38","432"],["Test Value 2","08/30/2017 15:59:07","1355"]] 

を取得し、私は.services.service[].name as $name | .services.service[].timer | map([ $name, .datetime, .value ])を作ってみた

{ 
    "services":{ 
     "service":[ 
     { 
      "name":"Test Value", 
      "timer":[ 
       { "datetime":"08/30/2017 16:33:35", "value":"625" }, 
       { "datetime":"08/30/2017 16:22:38", "value":"240" } 
      ] 
     }, 
     { 
      "name":"Test Value 2", 
      "timer":[ 
       { "datetime":"08/30/2017 16:07:38", "value":"432" }, 
       { "datetime":"08/30/2017 15:59:07", "value":"1355" } 
      ] 
     } 
     ] 
    } 
} 

、サービスとタイマーのセット。私は何が欠けていますか?

答えて

2

.services.service[]|[{name,timer:.timer[]}|[.name,.timer[]]]各タイマのためにあなたに1つの結果が得られます(配列凝集することなく)、あなたに

.services.service[]|{name,timer:.timer[]}|[.name,.timer[]]をあなたの期待される出力が得られます:

["Test Value","08/30/2017 16:33:35","625"] 
["Test Value","08/30/2017 16:22:38","240"] 
["Test Value 2","08/30/2017 16:07:38","432"] 
["Test Value 2","08/30/2017 15:59:07","1355"] 

あなたはあなたの試みで逃したことは

です

式expは$ x |となります。 ...は、式expの各値に対して、パイプラインの残りの部分を元の入力全体で実行し、$ xをその値に設定して実行することを意味します。したがって、foreachループのようなものとして機能します。

あなたは本当にあなたがこのようにそれを行うために必要な変数を使用したい場合:.services.service[]| .name as $name | .timer | map([ $name, .datetime, .value ])

0

を、私はあなたのデータが入っているレベルの面でそれを試してみて、視覚化する参考になると思うし、あなたそれがあなたの結果に欲しいです。データの階層をフラット化する場合、あるレベルで値を取って、それを次のレベルの値と組み合わせると考えるのが簡単です。

個々のサービスオブジェクトを見て、その名前を取得してタイマーオブジェクトのプロパティと組み合わせて、それぞれの組み合わせの結果を生成したいとします。そこで始める:

[.name] + (properties of the timer objects) 

次に、properties of the timer objectsを生成する必要があります。

.timer[] | [.datetime, .value] 

あなたがこれを読むことができます:「timerアレイ内の各項目のdatetimevalue特性からなるアレイを作成してください。」

すべてを同じレベルで取得したら、必要に応じて値を並べ替えることができますが、幸いにも私たちの場合はすべてが必要な場所です。

この式をまとめると、名前、日時、および値の個々の配列が生成されますが、配列内でそれらを収集する必要があります。だから、それらを入れてください。

[[.name] + (.timer[] | [.datetime, .value])] 

あなたはあなたの結果を得るでしょう。

.services.service[] | [[.name] + (.timer[] | [.datetime, .value])] 
1

ここでは、配列のコンストラクタのバリエーションを示す別のソリューションです。それぞれの[]内の配置は少し異なります。あなたのデータでは、このフィルタ

.services.service[] | {name} + .timer[] 

は、このフィルタは、この

[{"name":"Test Value","datetime":"08/30/2017 16:33:35","value":"625"},{"name":"Test Value","datetime":"08/30/2017 16:22:38","value":"240"}] 
[{"name":"Test Value 2","datetime":"08/30/2017 16:07:38","value":"432"},{"name":"Test Value 2","datetime":"08/30/2017 15:59:07","value":"1355"}] 

各サービスのためのオブジェクトの配列を生成

.services.service[] | [ {name} + .timer[] ] 

オブジェクト

{"name":"Test Value","datetime":"08/30/2017 16:33:35","value":"625"} 
{"name":"Test Value","datetime":"08/30/2017 16:22:38","value":"240"} 
{"name":"Test Value 2","datetime":"08/30/2017 16:07:38","value":"432"} 
{"name":"Test Value 2","datetime":"08/30/2017 15:59:07","value":"1355"} 

の単一のストリームを生成し、フィルタ

.services.service[] | {name} + .timer[] | [.[]] 

アレイ

["Test Value","08/30/2017 16:33:35","625"] 
["Test Value","08/30/2017 16:22:38","240"] 
["Test Value 2","08/30/2017 16:07:38","432"] 
["Test Value 2","08/30/2017 15:59:07","1355"] 

このフィルタ

.services.service[] | [ {name} + .timer[] | [.[]] ] 

のストリームが各サービス

[["Test Value","08/30/2017 16:33:35","625"],["Test Value","08/30/2017 16:22:38","240"]] 
[["Test Value 2","08/30/2017 16:07:38","432"],["Test Value 2","08/30/2017 15:59:07","1355"]] 
ための配列の配列を生成し、生成
関連する問題