2017-12-26 25 views
0

大きなデータセットで作業していますが、興味のあるデータのみを含むオブジェクトを作成するためにJQを使用しています。問題の説明に役立つサンプルデータを提供しました。JQオブジェクトに配列を挿入する

これまでのところ、2つのオブジェクトまたは2つの配列を追加する方法しか見つかりませんでしたが、フラットフィールドのセットを取得し、mainJsonにサブオブジェクトとして配列を追加します。

tmpData.txt

{ 
"id": "0001", 
"type": "donut", 
"name": "Cake", 
"ppu": 0.55, 
"batter": [{ 
     "id": "1001", 
     "type": "Regular", 
     "status":{ 
      "complete": false 
     } 
    }, 
    { 
     "id": "1002", 
     "type": "Chocolate", 
     "status":{ 
      "complete": false 
     } 
    }, 
    { 
     "id": "1003", 
     "type": "Blueberry", 
     "status":{ 
      "complete": false 
     } 
    }, 
    { 
     "id": "1004", 
     "type": "Devil's Food", 
     "status":{ 
      "complete": false 
     } 
    } 
] 
} 

はこれまでのところ、私が来た最も近いが、トップレベルのフィールドにのみ1時間を出力しますが、各打者はそれ自身のオブジェクトである。この

cat tmpData.txt | jq '[{id, type}] + [(.batter[] | {batterId: .id, complete: .status.complete})]'

です、私はこの全体の出力が1つのオブジェクトになる必要があります。

{ 
"id": "0001", 
"type": "donut", 
"batter": [{ 
    "id": "1001", 
    "complete": false 
    }, 
    { 
    "id": "1002", 
    "complete": false 
    }, 
    { 
    "id": "1003", 
    "complete": false 
    }, 
    { 
    "id": "1004", 
    "complete": false 
    }] 
} 

あなたは、私が知る必要があるすべてが含まれている1つのオブジェクトが存在し、かつ重複や無関係なデータがありません見ることができるように:私の理想的な出力は次のようになり

[ 
    { 
    "id": "0001", 
    "type": "donut" 
    }, 
    { 
    "batterId": "1001", 
    "complete": false 
    }, 
    { 
    "batterId": "1002", 
    "complete": false 
    }, 
    { 
    "batterId": "1003", 
    "complete": false 
    }, 
    { 
    "batterId": "1004", 
    "complete": false 
    } 
] 

。私はIDとそのステータスを持つ打者の配列を含む単一のオブジェクトを出力したいと思います。

+1

動作しますJSONオブジェクト

で表現されるだろうしてください場合、これは理にかなっていますより短く、より明確に、より一貫して、完全にするために質問を編集してください。たとえば、「理想出力」は切り捨てられます。また、 "理想的な出力"の.batter配列には、{id:_、complete:_}という形式の要素がありますが、試みには "batterId"と "status"があります。 – peak

+0

@peakありがとうございます。私は質問をクリアしてフィルターを修正しました。私はあなたが私の最後の質問に答えたと信じています、これはその延長ではありません。 – Goldfish

+0

明快にするために短縮された質問 – Goldfish

答えて

0

jqは、+演算子を使用して同じデータ型を追加することのみをサポートしています。オブジェクトに配列を追加することはできません。逆もできます。

オブジェクトを配列に追加するには、配列をオブジェクトにラップし、その配列を含むオブジェクトのキーを指定する必要があります。我々はJSON構造を考えると、どのように配列には、次のコマンドはtmpData.txtファイルに対して

cat tmpData.txt | jq '{id, type} + {Batters: [(.batter[] | {batterId: .id, batterType: .type, status: .status.complete})]}'

出力

{ 
    "id": "0001", 
    "type": "donut", 
    "Batters": [ 
    { 
     "batterId": "1001", 
     "batterType": "Regular", 
     "status": false 
    }, 
    { 
     "batterId": "1002", 
     "batterType": "Chocolate", 
     "status": false 
    }, 
    { 
     "batterId": "1003", 
     "batterType": "Blueberry", 
     "status": false 
    }, 
    { 
     "batterId": "1004", 
     "batterType": "Devil's Food", 
     "status": false 
    } 
    ] 
} 
関連する問題