मैं jq में कई फ़ील्ड्स का चयन कैसे करूँ?


102

मेरी इनपुट फ़ाइल कुछ इस प्रकार है:

{
"login": "dmaxfield",
"id": 7449977,
...
}
{
"login": "dmaxfield",
"id": 7449977,
...
}

मुझे इसके साथ सभी लॉगिन नाम मिल सकते हैं: cat members | jq '.[].login'

लेकिन मैं लॉगिन और आईडी दोनों प्राप्त करने के लिए सिंटैक्स को क्रैक नहीं कर पाया हूं?


क्या आप इसका उदाहरण प्रदान कर सकते हैं कि आपका अपेक्षित आउटपुट कैसा दिखना चाहिए? ऐसे कई तरीके हैं जिनमें लॉगिन / आईडी जोड़े का प्रतिनिधित्व किया जा सकता है।

जवाबों:


144

आप jq '.[] | .login, .id'प्रत्येक लॉगिन के बाद उसका आईडी प्राप्त करने के लिए उपयोग कर सकते हैं ।


1
उपयोगकर्ताओं का नमूना इनपुट वस्तुओं की एक धारा की तरह दिखता है, लेकिन वे जो नमूना स्क्रिप्ट प्रदान करते हैं, मैं मान रहा हूं कि यह एक सरणी में लिपटा हुआ है जिसे उन्होंने छोड़ दिया था।

1
@ सैंटियागो लैप्रिस्टा: उस धारणा की कोई आवश्यकता नहीं है। jqवस्तुओं के अनुक्रम के साथ महान काम करता है - सरणी आवरण के लिए कोई ज़रूरत नहीं है। ...तार और पिछले अनुगामी अल्पविराम की जरूरत को हटाने, लेकिन मैं विचार है कि निहित किया जाना है।
पीटर वी। मॉर्क

56
या यदि आप केवल उन दो क्षेत्रों को प्रदर्शित करना चाहते हैं। jq '.[] | {login, id}'
कैमरन टैगगार्ट 20

4
@CameronTaggart, अगर मैं प्रदर्शित करना चाहता हूं तो क्या होगा login.name? jq '.[] | {login.name, id}'काम करने लगता है, क्या उचित तरीका है, कृपया?
zyxue

7
@zyxue यह काम करता है:jq '.[] | {name: .login.name, id}'
एलेक्स ग्राउंड्स

71

यह मेरे लिए काम करता है:

> echo '{"a":1,"b":2,"c":3}{"a":1,"b":2,"c":3}' | jq '{a,b}'
{
  "a": 1,
  "b": 2
}
{
  "a": 1,
  "b": 2
}

यह सरल है और वास्तव में वही करता है जो मैं करना चाहता था: कई इनपुट ऑब्जेक्ट / हैश हैं और उनमें से केवल कुछ मान लेते हैं, जबकि उन्हें ऑब्जेक्ट के रूप में आउटपुट भी करते हैं।
स्मार

11

उन मानों का चयन करने के लिए जो विभिन्न स्तरों (यानी पहले और दूसरे स्तर दोनों) के लिए प्रेरित हैं, आप निम्नलिखित का उपयोग कर सकते हैं:

$ echo '[{"a":{"aa":1,"ab":2},"b":3,"c":4},{"a":{"aa":5,"ab":6},"b":7,"c":8}]'|jq '.[]|[.a.aa,.a.ab,.b]'

[
  1,
  2,
  3
]
[
  5,
  6,
  7
]

4

बस यहां एक और उदाहरण दें (jq-1.6):

किसी ऐरे से चलें और किसी ऑब्जेक्ट एलिमेंट का फील्ड और उस ऑब्जेक्ट में ऑब्जेक्ट का फील्ड चुनें

echo '[{"id":1, "private_info": {"name": "Ivy", "age": 18}}, {"id":2, "private_info": {"name": "Tommy", "aga": 18}}]' | jq ".[] | {id: .id, name: .private_info.name}" -

{
  "id": 1,
  "name": "Ivy"
}
{
  "id": 2,
  "name": "Tommy"
}

उदाहरण डेटा के बिना:

jq ".[] | {id, name: .private_info.name}" -

.[]: एक सरणी के माध्यम से चलना

{id, name: .private_info.name}: .id और .pStreet_info.name लें और इसे फ़ील्ड नाम "आईडी" और "नाम" के साथ किसी ऑब्जेक्ट में लपेटें


संरचना / प्रमुख नामों को बनाए रखने के लिए वस्तु में लपेटना बहुत अच्छा है, बस मैं जो
चाह
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.