2016-07-21 9 views
1

I以下のJSONがあります選択または除外倍数は、IDの配列を持つオブジェクト

[ 
    { 
    "id": "1", 
    "foo": "bar-a", 
    "hello": "world-a" 
    }, 
    { 
    "id": "2", 
    "foo": "bar-b", 
    "hello": "world-b" 
    }, 
    { 
    "id": "10", 
    "foo": "bar-c", 
    "hello": "world-c" 
    }, 
    { 
    "id": "42", 
    "foo": "bar-d", 
    "hello": "world-d" 
    } 
] 

を私持っている変数に次の配列店:["1", "2", "56", "1337"](IDは文字列であることに注意してください、そして任意の正規を含むことができキャラクター)。

ありがとうございましたto this SO、元のデータをフィルタリングする方法が見つかりました。

[ 
    { 
    "id": "1", 
    "foo": "bar-a", 
    "hello": "world-a" 
    }, 
    { 
    "id": "2", 
    "foo": "bar-b", 
    "hello": "world-b" 
    } 
] 

しかし、私はまた、(それらを選択するのではなく、基本的に除くのID)反対を行うのが好きでしょう:jq 'jq '[.[] | select(.id == ("1", "2", "56", "1337"))]' ./data.json(注意配列は括弧ではなく角括弧で囲まれている)が生成されます。 select(.id != ("1", "2", "56", "1337"))を使用しても動作しません。jq '[. - [.[] | select(.id == ("1", "2", "56", "1337"))]]' ./data.jsonを使用すると非常に醜いように見え、実際のデータ(出力はaws ec2 describe-instances)では機能しません。

これを行うにはどうすればよいですか?ありがとうございました!

答えて

2

これらを含めるには、そのIDがキープセット内の値のいずれかであることを確認する必要があります。

$ jq --argjson include '["1", "2", "56", "1337"]' 'map(select(.id == $include[]))' ... 

これらを除外するには、すべての値が除外セットに含まれていないことを確認する必要があります。しかし、元のセットを取り出し、除外セットに含まれるアイテムを削除する方が簡単かもしれません。ここで

$ jq --argjson exclude '["1", "2", "56", "1337"]' '. - map(select(.id == $exclude[]))' ... 
+0

私はこれを好きですが、除外の場合は、「非常に醜い」と呼ばれる1つのOPです... –

+0

こんにちは、ありがとうございました回答。最初のものでは、変数 "$ include"の名前を付けるとエラーになりますが、別の名前を付けると5分で機能します。しかしそれでも、リンクされているSOに言及されている方が良いです。しかし、除外ソリューションのためには、それはまだ少し醜いと思いますが、もっと重要なことは動作しません。私が言ったように、私の実際のJSONデータはAWS CLIから返されます(オブジェクトはかなり重いです)。 –

+0

@Florentin:あなたの状況をよりよく代表する例を提供する必要があります。提供された答えは、与えられた例について望む結果を得ます。また、他のアプローチもありますが、私はこのアプローチをとった理由を表現するのが少し複雑です。ニーズに合ったソリューションが必要な場合は、詳細情報を提供する必要があります。 –

0

は内部を使用するソリューションです。あなたは

jq -M --argjson IDS '["1","2","56","1337"]' -f filter.jq data.json 

このfilter.jq

map(select([.id] | inside($IDS))) 

としてJQを実行すると仮定すると$IDS配列であるdata.jsonからIDを生成します。

[ 
    { 
    "id": "1", 
    "foo": "bar-a", 
    "hello": "world-a" 
    }, 
    { 
    "id": "2", 
    "foo": "bar-b", 
    "hello": "world-b" 
    } 
] 

このfilter.jq

map(select([.id] | inside($IDS) | not)) 

$IDS配列ではありませんdata.jsonからIDを生成します。

[ 
    { 
    "id": "10", 
    "foo": "bar-c", 
    "hello": "world-c" 
    }, 
    { 
    "id": "42", 
    "foo": "bar-d", 
    "hello": "world-d" 
    } 
] 
関連する問題