Jq का उपयोग करके ऑब्जेक्ट में वैरिएबल के आधार पर ऑब्जेक्ट का चयन करें


236

मेरे पास निम्नलिखित json फ़ाइल है:

{
    "FOO": {
        "name": "Donald",
        "location": "Stockholm"
    },
    "BAR": {
        "name": "Walt",
        "location": "Stockholm"
    },
    "BAZ": {
        "name": "Jack",
        "location": "Whereever"
    }
}

मैं jq का उपयोग कर रहा हूं और उन वस्तुओं के "नाम" तत्वों को प्राप्त करना चाहता हूं जहां 'स्थान' 'स्टॉकहोम' है।

मुझे पता है कि मैं सभी नामों को प्राप्त कर सकता हूं

cat json | jq .[] | jq ."name"
"Jack"
"Walt"
"Donald"

लेकिन मैं यह पता नहीं लगा सकता कि केवल कुछ वस्तुओं को कैसे प्रिंट किया जाए, एक उप कुंजी (यहां "location" : "Stockholm") का मूल्य दिया जाए ।

जवाबों:


341

JSON के साथ प्रसंस्करण JSON पर इस पोस्ट से अनुकूलित , आप select(bool)इस तरह का उपयोग कर सकते हैं :

$ jq '.[] | select(.location=="Stockholm")' json
{
  "location": "Stockholm",
  "name": "Walt"
}
{
  "location": "Stockholm",
  "name": "Donald"
}

30
मुझे माता-पिता 'FOO', 'BAR', 'BAZ' कैसे मिलेंगे?
spazm

184

केवल नामों की एक धारा प्राप्त करने के लिए:

$ jq '.[] | select(.location=="Stockholm") | .name' json

पैदा करता है:

"Donald"
"Walt"

संबंधित (मुख्य नाम, "नाम" विशेषता) जोड़े की एक धारा प्राप्त करने के लिए, विचार करें:

$ jq -c 'to_entries[]
        | select (.value.location == "Stockholm")
        | [.key, .value.name]' json

आउटपुट:

["FOO","Donald"]
["BAR","Walt"]

वह स्थान के आधार पर पूरी वस्तु चाहता है: "मैं यह पता नहीं लगा सकता कि केवल कुछ वस्तुओं को कैसे प्रिंट किया जाए, एक उप कुंजी का मूल्य दिया"
फोम।

2
आपको चयन के बाद पाइप की आवश्यकता नहीं है: $ jq '। [] | select (.location == "स्टॉकहोम")। नाम 'json
दीपक

nameमुख्य चर बनाना ( $1पैरामीटर के रूप में एक शेल फ़ंक्शन का उपयोग करें ) काम नहीं करता है termux-contact-list |jq -r '.[] | select(.name=="$1")|.number':। मैं इसे कॉल करता हूं cool_fn Name1। हालाँकि, यह काम करता है:termux-contact-list |jq -r '.[] | select(.name=="Name1")|.number'
टिमो

यहाँ समाधान है यदि आप इसे चर पसंद करते हैं।
तिमो

27

मेरे पास एक समान संबंधित प्रश्न था: क्या होगा यदि आप मूल ऑब्जेक्ट प्रारूप को वापस चाहते हैं (प्रमुख नामों, जैसे FOO, BAR) के साथ?

Jq प्रदान करता है to_entriesऔर from_entriesवस्तुओं और कुंजी-मूल्य जोड़ी सरणियों के बीच परिवर्तित करने के लिए। कि mapचयन के आसपास के साथ

ये फ़ंक्शन किसी ऑब्जेक्ट और की-वैल्यू जोड़े की एक सरणी के बीच परिवर्तित होते हैं। यदि to_entries एक ऑब्जेक्ट पास की जाती है, तो इनपुट में प्रत्येक k: v प्रविष्टि के लिए, आउटपुट सरणी में {"key": k, "value": v} शामिल हैं।

from_entries विपरीत रूपांतरण करता है, और with_entries (फू) to_entries के लिए एक आशुलिपि है map (फू) | from_entries, एक वस्तु के सभी कुंजी और मूल्यों के लिए कुछ ऑपरेशन करने के लिए उपयोगी। from_entries कुंजी, कुंजी, नाम, नाम, मान और मान को कुंजियों के रूप में स्वीकार करता है।

jq15 < json 'to_entries | map(select(.value.location=="Stockholm")) | from_entries'

{
  "FOO": {
    "name": "Donald",
    "location": "Stockholm"
  },
  "BAR": {
    "name": "Walt",
    "location": "Stockholm"
  }
}

with_entriesआशुलिपि का उपयोग , यह हो जाता है:

jq15 < json 'with_entries(select(.value.location=="Stockholm"))'
{
  "FOO": {
    "name": "Donald",
    "location": "Stockholm"
  },
  "BAR": {
    "name": "Walt",
    "location": "Stockholm"
  }
}

1
एक बात जो मुझे चुभती है, वह यह है कि आपको यह याद रखने की आवश्यकता है कि उपयोग करते समय with_entries(), आप आमतौर पर खंड .valueमें भी उपयोग करना चाहते हैं select। ऐसा इसलिए है क्योंकि to_entriesमैक्रो दी गई प्रविष्टियों को जोड़े .keyऔर .valueजोड़े में परिवर्तित करता है , जो इसके साथ भी होता है with_entries
जाको
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.