Jq ব্যবহার করে অবজেক্টে ভেরিয়েবলের মানের ভিত্তিতে অবজেক্ট নির্বাচন করুন


236

আমার কাছে নিম্নলিখিত জেসন ফাইল রয়েছে:

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

আমি জেকিউ ব্যবহার করছি এবং অবজেক্টের "নাম" উপাদানগুলি পেতে চাই যেখানে 'অবস্থান' স্টকহোম '।

আমি জানি আমি এর মাধ্যমে সমস্ত নাম পেতে পারি

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

তবে আমি কী কী উপ-কী (এখানে "location" : "Stockholm") এর মান দিয়ে শুধুমাত্র কিছু নির্দিষ্ট জিনিস মুদ্রণ করব তা বুঝতে পারি না ।

উত্তর:


341

JQ সহ প্রসেসিং JSON এ এই পোস্টটি থেকে অভিযোজিত , আপনি এটি ব্যবহার করতে পারেন select(bool):

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

30
আমি কীভাবে পিতামাতাদের 'FOO', 'বার', 'BAZ' পাব?
স্পাজম

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
নির্বাচনের পরে আপনার পাইপের দরকার নেই: $ জকিউ '[[] | নির্বাচন করুন (.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 প্রবেশের জন্য ইনপুটটিতে আউটপুট অ্যারেতে {"কী": k, "মান": v includes অন্তর্ভুক্ত থাকে}

from_entries বিপরীত রূপান্তর করে, এবং with_entries (foo) to_entries জন্য একটি সংক্ষিপ্ত বিবরণ | মানচিত্র (foo) | 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
যাক্কো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.