2016-10-11 11 views
5

jq का उपयोग करके अभिभावक का चयन करने के लिए jq का उपयोग करना, यदि मैं एक बच्चे ऑब्जेक्ट को दो फ़िल्टर आवश्यकताओं को पूरा करता हूं तो मैं मूल ऑब्जेक्ट का चयन कैसे करूं?बच्चे कुंजी/मूल्य जोड़ी

इस उदाहरण में मैं सभी सबनेट तत्वों का चयन करना चाहता हूं जिनमें कुंजी "नाम" और मूल्य "TheName" वाला बच्चा टैग है। मेरे उदाहरण में दो सबनेट हैं। पहले गलत कुंजी में "TheName" है। दूसरे सबनेट में नाम/मूल्य जोड़ी है जिसे मैं ढूंढ रहा हूं। यानी "Key": "Name", "Value": "TheName"

निम्नलिखित टैग में से किसी एक में निर्दिष्ट मान के साथ एक सबनेट का चयन करता है लेकिन जोड़ी नहीं। यह केवल दूसरे सबनेट की बजाय दोनों सबनेट्स देता है।

jq '.Subnets[] | select(.Tags[].Value=="TheName")' output 

मैं केवल उन सबनेट्स का चयन करने के लिए jq का उपयोग कैसे करूं जिनके नाम/मूल्य जोड़ी मैं ढूंढ रहा हूं?

{ 
    "Subnets": [ 
     { 
      "VpcId": "vpc-12345678", 
      "SubnetId": "subnet-1234567a", 
      "Tags": [ 
       { 
        "Key": "IgnoreThis", 
        "Value": "TheName" 
       }, 
       { 
        "Key": "Name", 
        "Value": "NotTheName" 
       } 
      ] 
     }, 
     { 
      "VpcId": "vpc-12345678", 
      "SubnetId": "subnet-1234567b", 
      "Tags": [ 
       { 
        "Key": "IgnoreThis", 
        "Value": "ignore" 
       }, 
       { 
        "Key": "Name", 
        "Value": "TheName" 
       } 
      ] 
     } 
    ] 
} 

वांछित आउटपुट होगा:

{ 
    "VpcId": "vpc-12345678", 
    "SubnetId": "subnet-1234567b", 
    "Tags": [ 
     { 
      "Key": "IgnoreThis", 
      "Value": "ignore" 
     }, 
     { 
      "Key": "Name", 
      "Value": "TheName" 
     } 
    ] 
} 
+0

का उपयोग करता है सबसे अच्छी तरह से लिखा यूनिक्स कमांड, 'jq', एक फ़ाइल नाम तर्क पढ़ सकते हैं ताकि [' cat' बेकार है] (http की तरह है .iki.fi/era/unix/award.html) – tripleee

उत्तर

4

मानते हुए अपने JQ any/2, है एक सरल और प्रभावी समाधान होगा:

.Subnets[] 
| select(any (.Tags[]; .Key == "Name" and .Value == "TheName")) 

यह आउटपुट आप चाहते हैं पैदा करता है, तो मैं इसे दोहराना नहीं होगा।

अपने JQ any/2 नहीं है, तो, मैं उन्नयन का सुझाव चाहते हैं, लेकिन यह है कि अगर असुविधाजनक या एक विकल्प नहीं है, तो आप इस डीईएफ़ इस्तेमाल कर सकते हैं:

def any(f;g): reduce f as $i (false; . or ($i|g)); 

पी.एस. any(str; cond) को इस प्रकार पढ़ा जा सकता है: 'क्या कोई तत्व है, ई, धारा में, str, जैसे e|condnull या false के अलावा कोई मान है?' : // www

+0

बहुत बढ़िया चोटी! मुझे "किसी भी" पर दस्तावेज़ों को समझ में नहीं आया। Jq पर दस्तावेज़ और उदाहरण सुपर स्पष्ट नहीं हैं। इसे इस तरह के अधिक उदाहरणों की आवश्यकता है। उम्मीद है कि प्रश्न शीर्षक किसी और को आपकी प्रतिक्रिया खोजने में मदद करेगा! –

0

यहाँ एक समाधान है जो indices

.Subnets[] | select(.Tags | indices({Key:"Name", Value:"TheName"}) != []) 
संबंधित मुद्दे