জেসন সিরিয়ালভাবে পার্স করতে এবং একাধিক ক্ষেত্র প্রদর্শন করতে jq ব্যবহার করে


237

আমার এই জসন আছে

{
    "users": [
        {
            "first": "Stevie",
            "last": "Wonder"
        },
        {
            "first": "Michael",
            "last": "Jackson"
        }
    ]
}

জিকিউ ব্যবহার করে আমি প্রথম এবং শেষ নাম সিরিয়ালি প্রদর্শন করতে চাই। তাই ভালো -

Stevie Wonder
Michael Jackson

এই যে আমি কতদূর পেয়েছি -

jq '.users[].first, .users[].last'

তবে এটি প্রদর্শিত হয়

"Stevie"
"Michael"
"Wonder"
"Jackson"

নিম্নলিখিতটি লক্ষ্য করুন -

  1. ডাবল উক্তি যে আমি চাই না।
  2. আমি চাই না এমন গাড়ি ফেরত আসবে।
  3. এটা লাফিয়ে উঠছে। আমার ক্যোয়ারী প্রথমে সমস্ত প্রথম নাম এবং তারপরে সমস্ত শেষ নাম প্রদর্শন করে। তবে আমি প্রথম-শেষ, প্রথম-শেষ জুটি চাই।

উত্তর:



203

আপনি সংলগ্ন স্ট্রিং যোগ করতে পারেন ।

স্ট্রিংগুলি আরও বড় স্ট্রিংয়ের সাথে যুক্ত হয়ে যুক্ত করা হয়।

jq '.users[] | .first + " " + .last'

উভয় firstএবং lastস্ট্রিং যখন উপরের কাজ করে । আপনি যদি আলাদা আলাদা ডেটাটাইপ (সংখ্যা এবং স্ট্রিং) বের করেন তবে আমাদের সমতুল্য ধরণের রূপান্তর করা দরকার। এই প্রশ্নের সমাধান উল্লেখ করে । উদাহরণ স্বরূপ.

jq '.users[] | .first + " " + (.number|tostring)'

41
জেএসওএন উদ্ধৃতি চিহ্নগুলি অপসারণ করতে, -r বিকল্পের সাহায্যে জেকিউকে অনুরোধ করুন, যেমন জেকিউ-আর '। ব্যবহারকারীরা [] | .প্রথম + "" +। প্রথম '
শিখর

4
+1, তবে আমার ব্যবহারের ক্ষেত্রে, আমি একই সারিতে দুটি সংখ্যা ফর্ম্যাট করার চেষ্টা করছি। এই পদ্ধতিটি ব্যর্থ হয়েছে কারণ এটি " "কোনও সংখ্যায় যুক্ত করতে পারে না । এরিকের উত্তর এই ক্ষেত্রে আরও ভাল ফলাফল দেয়।
সেনেসো

9
@ সায়েন্সো: (.numA|tostring) + " " + (.numB|tostring)কাজ করা উচিত। বা ব্যবহার স্ট্রিং ক্ষেপক পরিবর্তে: "\(.numA) \(.numB)"
এলএস

যখন আমি করেছি jq '.users[] | .first + " " + .last', এটি খুব ভাল কাজ করেছে, কিন্তু এর মান .firstএবং এর মধ্যে একটি নতুন লাইন তৈরি করেছে .last। আমি পরিবর্তন " "করতে "@"এবং তারপর একটি করেনি sed 's/@/ /g'আউটপুট "জন স্মিথ" পেতে আউটপুট উপর। এরকম কিছু:jq '.users[] | .first + "@" + .last' | sed 's/@/ /g'
ব্লাডিসক


14

উপরের উত্তরগুলি উভয়ই যদি কী, মান স্ট্রিং হয় তবে ভালভাবে কাজ করে তবে আমার কাছে একটি স্ট্রিং এবং পূর্ণসংখ্যা সংযুক্ত করার পরিস্থিতি ছিল (উপরের এক্সপ্রেশনগুলি ব্যবহার করে জেকিউ ত্রুটি)

প্রয়োজনীয়তা: জসনের নীচে একটি url তৈরি করা

pradeep@seleniumframework>curl http://192.168.99.103:8500/v1/catalog/service/apache-443 | jq .[0]
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   251  100   251    0     0   155k      0 --:--:-- --:--:-- --:--:--  245k
{
  "Node": "myconsul",
  "Address": "192.168.99.103",
  "ServiceID": "4ce41e90ede4:compassionate_wozniak:443",
  "ServiceName": "apache-443",
  "ServiceTags": [],
  "ServiceAddress": "",
  "ServicePort": 1443,
  "ServiceEnableTagOverride": false,
  "CreateIndex": 45,
  "ModifyIndex": 45
}

সমাধান:

curl http://192.168.99.103:8500/v1/catalog/service/apache-443 |
jq '.[0] | "http://" + .Address + ":" + "\(.ServicePort)"'

নোট করুন যে বন্ধ হওয়া প্রথম বন্ধনী থেকে বাঁচার দরকার নেই, এবং ভুল হবে।
nymo

2
@ সিমো: এটি পালাচ্ছে না। \(...)স্ট্রিং ইন্টারপোলেশন। এখানে এটি সংখ্যাকে .ServicePortস্ট্রিংয়ে পরিণত করে। +এই দ্রষ্টব্যকে সংক্ষিপ্ত করার লক্ষণগুলির জায়গায় ইন্টারপোলেশন ব্যবহার করা যেতে পারে ।
এলএস

12

এটি নামের একটি অ্যারে তৈরি করবে

> jq '[ .users[] | (.first + " " + .last) ]' ~/test.json

[
  "Stevie Wonder",
  "Michael Jackson"
]

4

আমি এরকম কিছু করে যা চেয়েছিলাম তার খুব কাছাকাছি এসেছি

cat my.json | jq '.my.prefix[] | .primary_key + ":", (.sub.prefix[] | "    - " + .sub_key)' | tr -d '"' 

যার আউটপুটটি আমার কাছে প্রায় কোনও সমস্যা ছাড়াই এটি অন্যান্য সরঞ্জামগুলিতে আমদানি করার জন্য যথেষ্ট পরিমাণে ইয়ামল করার পক্ষে যথেষ্ট। (আমি এখনও ইনপুট জেসসনের একটি উপসেটটি বেসিকাল্ট রফতানি করার উপায় খুঁজছি)


1
এই ক্ষেত্রে আমার ক্ষেত্রে কাজ করে, কেবল ড্রপ | টিআর-ডি '' 'শেষে, এবং জিকিউ -র জন্য যুক্ত বিকল্প সংযোজন
ইউজার 842479

4

আমার পন্থাটি হবে (আপনার জসন উদাহরণটি ভালভাবে গঠন করেনি .. অনুমান কেবলমাত্র একটি নমুনা)

jq '.Front[] | [.Name,.Out,.In,.Groups] | join("|")'  front.json  > output.txt

এরকম কিছু ফেরত দেয়

"new.domain.com-80|8.8.8.8|192.168.2.2:80|192.168.3.29:80 192.168.3.30:80"
"new.domain.com -443|8.8.8.8|192.168.2.2:443|192.168.3.29:443 192.168.3.30:443"

এবং নিয়মিত এক্সপ্রেশন দিয়ে আউটপুট গ্রেপ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.