2015-01-27 6 views
77

मैं इस Jsonपार्स और एक json में एक से अधिक फ़ील्ड प्रदर्शित करने के JQ का उपयोग करते हुए क्रमानुसार

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

JQ का उपयोग करते हुए मैं प्रथम और अंतिम नाम क्रमानुसार प्रदर्शित करने के लिए करना चाहते हैं। इसलिए जैसा -

Stevie Wonder 
Michael Jackson 

यह कितनी दूर मैं मिल गया है है -

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

लेकिन यह प्रदर्शित करता है

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

सूचना निम्नलिखित -

  1. दोहरे उद्धरण चिह्नों कि मैं नहीं चाहिए।
  2. कैरिज रिटर्न जो मैं नहीं चाहता हूं।
  3. यह जुड़ा हुआ है। मेरी क्वेरी पहले सभी नामों को प्रदर्शित करती है, और फिर सभी अंतिम नाम। हालांकि, मैं पहली बार आखिरी आखिरी जोड़ी चाहता हूं।
+0

वास्तव में मैं कमांड लाइन जेसन प्रोसेसर का उपयोग कर रहा हूं जिसे jq - http://stedolan.github.io/jq/manual/ – San

उत्तर

115

मैं स्ट्रिंग अंतर्वेशन का उपयोग करना चाहिये:

jq '.users[] | "\(.first) \(.last)"' 

reference

+4

कहा जाता है यदि आपका डेटा नंबर – ozOli

+1

है तो यह बेहतर क्यों होगा? मुझे "\ (...)" वाक्यविन्यास के बारे में और कहां मिल सकता है? – spazm

+1

https://stedolan.github.io/jq/manual/#Stringinterpolation-%5C%28foo%29 –

88

आप addition उपयोग कर सकते हैं तार जोड़ लिए।

स्ट्रिंग्स एक बड़ी स्ट्रिंग में शामिल होने के द्वारा जोड़े गए हैं। निर्माण करने के लिए:

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

JSON उद्धरण चिह्नों को खत्म करने के लिए, jr को -r विकल्प के साथ आमंत्रित करें, उदा। jq -r '.users [] | । फर्स्ट + "" + .last ' – peak

+1

+1, लेकिन मेरे उपयोग के मामले में, मैं दो पंक्तियों को एक ही पंक्ति पर प्रारूपित करने की कोशिश कर रहा हूं।यह दृष्टिकोण विफल रहता है क्योंकि यह किसी संख्या में '' "जोड़ नहीं सकता है। एरिक का जवाब इस मामले के लिए बेहतर परिणाम देता है। – Synesso

+1

@ साइनेसो: '(.numA | tostring) +" "+ (.numB | tostring) 'काम करना चाहिए। या इसके बजाय स्ट्रिंग इंटरपोलेशन का उपयोग करें: '" \ (। NumA) \ (। NumB) "'। –

5

ऊपर जवाब में से दोनों अच्छी तरह से करता है, तो कुंजी काम करते हैं, मूल्य रहे हैं तार, मैं एक (ऊपर अभिव्यक्ति का उपयोग करते JQ त्रुटियों) एक स्ट्रिंग और पूर्णांक संलग्न करने के लिए

आवश्यकता स्थिति थी एक json नीचे आउट uRL

[email protected]>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)"' 
+0

ध्यान दें कि समापन कोष्ठक से बचने की आवश्यकता नहीं है, और गलती होगी। – nymo

+0

@nymo: यह भाग नहीं रहा है। '\ (...) 'स्ट्रिंग इंटरपोलेशन है। यहां यह संख्यात्मक '.ServicePort' स्ट्रिंग में बदल जाता है। इस समाधान को कम करने के लिए '+ 'संकेतों के स्थान पर इंटरपोलेशन का उपयोग किया जा सकता है। –

0

मैं बहुत मैं क्या इस

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

उत्पादन जिनमें से काफी पास YAML करने के लिए मुझे आम तौर पर बहुत समस्या के बिना अन्य उपकरणों में आयात करने के लिए है की तरह कुछ कर रही द्वारा चाहता था के पास मिला है। (मैं अभी भी इनपुट जेसन के उप-समूह को निर्यात करने का एक तरीका ढूंढ रहा हूं)

संबंधित मुद्दे