jq

2017-02-15 8 views
12

का उपयोग कर मौजूदा JSON सरणी में एक नया तत्व जोड़ें मेरे पास एक जेसन फ़ाइल है और मैं उस पर एक नई ऑब्जेक्ट सरणी जोड़ना चाहता हूं। मैं jq कमांड लाइन का उपयोग करने की कोशिश कर रहा हूँ। जैसे-जैसे मैं इंटरनेट पर देख रहा था, यह आदेश ऐसा करना है, न केवल जेसन फ़ाइल में क्वेरी ऑब्जेक्ट्स के लिए। लेकिन मैं यह नहीं समझ सकता कि jq पर ADD कमांड का उपयोग कैसे करें। रिपोर्ट-2017-01-07.json मेरे JSON फ़ाइल है >>jq

{ 
    "report":"1.0", 
    "data":{ 
     "date":"2010-01-07", 
     "messages":[ 
     { 
      "date":"2010-01-07T19:58:42.949Z", 
      "xml":"xml_samplesheet_2017_01_07_run_09.xml", 
      "status":"OK", 
      "message":"metadata loaded into iRODS successfully" 
     }, 
     { 
      "date":"2010-01-07T20:22:46.949Z", 
      "xml":"xml_samplesheet_2017_01_07_run_09.xml", 
      "status":"NOK", 
      "message":"metadata duplicated into iRODS" 
     }, 
     { 
      "date":"2010-01-07T22:11:55.949Z", 
      "xml":"xml_samplesheet_2017_01_07_run_09.xml", 
      "status":"NOK", 
      "message":"metadata was not validated by XSD schema" 
     } 
     ] 
    } 
} 

मैं नीचे आदेश >> उपयोग कर रहा हूँ

$ cat report-2017-01-07.json | jq -s '.data.messages {"date": "2010-01-07T19:55:99.999Z", "xml": "xml_samplesheet_2017_01_07_run_09.xml", "status": "OKKK", "message": "metadata loaded into iRODS successfullyyyyy"}' 
jq: error: syntax error, unexpected '{', expecting $end (Unix shell quoting issues?) at <top-level>, line 1: 
.data.messages {"date": "2010-01-07T19:55:99.999Z", "xml": "xml_samplesheet_2017_01_07_run_09.xml", "status": "OKKK", "message": "metadata loaded into iRODS successfullyyyyy"}    
jq: 1 compile error 

मैं पहले से ही एक और आदेशों संयोजन की कोशिश की लेकिन मैं हमेशा के साथ समाप्त कर रहा हूँ त्रुटि संकलन। इसके बारे में कोई संकेत? धन्यवाद!

उत्पादन की तरह लग रहे चाहिए >>

{ 
    "report": "1.0", 
    "data": { 
     "date": "2010-01-07", 
     "messages": [{ 
      "date": "2010-01-07T19:58:42.949Z", 
      "xml": "xml_samplesheet_2017_01_07_run_09.xml", 
      "status": "OK", 
      "message": "metadata loaded into iRODS successfully" 
     }, { 
      "date": "2010-01-07T20:22:46.949Z", 
      "xml": "xml_samplesheet_2017_01_07_run_09.xml", 
      "status": "NOK", 
      "message": "metadata duplicated into iRODS" 
     }, { 
      "date": "2010-01-07T22:11:55.949Z", 
      "xml": "xml_samplesheet_2017_01_07_run_09.xml", 
      "status": "NOK", 
      "message": "metadata was not validated by XSD schema" 
     }, { 
      "date": "2010-01-07T19:55:99.999Z", 
      "xml": "xml_samplesheet_2017_01_07_run_09.xml", 
      "status": "OKKKKKKK", 
      "message": "metadata loaded into iRODS successfullyyyyy" 
     }] 
    } 
} 
+0

यह अच्छी तरह से पता नहीं है, लेकिन यह एक ऐसा मुद्दा है .data.messages एक arrray है ना? तो आपको .data.messages जैसे कुछ चाहिए। [] –

+0

क्षमा करें, –

+0

काम नहीं किया ठीक है - दस्तावेज़ों को पढ़ें और jq इंस्टॉल करें (यहां विंडोज़ पर) और कोशिश की - आपके जैसा ही त्रुटि प्राप्त करें। ऐसा लगता है कि विंडोज शैल के पास समस्याएं हैं जो स्ट्रीम में डबल कोट्स को खिलाती हैं जो jq की यात्रा करती है। काम करने के लिए कुछ भी नहीं मिला, इसलिए आपके प्रश्न का कोई जवाब नहीं है लेकिन आप jq कमांड में डबल कोट्स से बचने के लिए देख सकते हैं। इसलिए यदि मैं इस आदेश का उपयोग करता हूं तो मैं "तारीख" '' \ "दिनांक \" ' –

उत्तर

15

फिल्टर में |= .+ हिस्सा मौजूदा सरणी के लिए एक नया तत्व जोड़ता है। आप के रूप में

jq '.data.messages[3] |= . + {"date": "2010-01-07T19:55:99.999Z", "xml": "xml_samplesheet_2017_01_07_run_09.xml", "status": "OKKK", "message": "metadata loaded into iRODS successfullyyyyy"}' inputJson 

फिल्टर के साथ jq का उपयोग हार्डकोडेड लंबाई मूल्य 3 का उपयोग कर से बचने के लिए कर सकते हैं और गतिशील रूप से एक नया तत्व जोड़ सकती . | length जो लंबाई, जो अगले सरणी सूचकांक के रूप में इस्तेमाल किया जा सकता देता है, यानी

का उपयोग
jq '.data.messages[.data.messages| length] |= . + {"date": "2010-01-07T19:55:99.999Z", "xml": "xml_samplesheet_2017_01_07_run_09.xml", "status": "OKKK", "message": "metadata loaded into iRODS successfullyyyyy"}' inputJson 
टिप्पणी में चोटी के सुझाव के अनुसार

(या), += ऑपरेटर अकेले

jq '.data.messages += [{"date": "2010-01-07T19:55:99.999Z", "xml": "xml_samplesheet_2017_01_07_run_09.xml", "status": "OKKK", "message": "metadata loaded into iRODS successfullyyyyy"}]' 
का उपयोग कर

जो आपको आवश्यकतानुसार आउटपुट उत्पन्न करता है। अपने jq-filter और अनुकूलन जो कुछ भी तरह से आप चाहते हैं

{ 
    "report": "1.0", 
    "data": { 
    "date": "2010-01-07", 
    "messages": [ 
     { 
     "date": "2010-01-07T19:58:42.949Z", 
     "xml": "xml_samplesheet_2017_01_07_run_09.xml", 
     "status": "OK", 
     "message": "metadata loaded into iRODS successfully" 
     }, 
     { 
     "date": "2010-01-07T20:22:46.949Z", 
     "xml": "xml_samplesheet_2017_01_07_run_09.xml", 
     "status": "NOK", 
     "message": "metadata duplicated into iRODS" 
     }, 
     { 
     "date": "2010-01-07T22:11:55.949Z", 
     "xml": "xml_samplesheet_2017_01_07_run_09.xml", 
     "status": "NOK", 
     "message": "metadata was not validated by XSD schema" 
     }, 
     { 
     "date": "2010-01-07T19:55:99.999Z", 
     "xml": "xml_samplesheet_2017_01_07_run_09.xml", 
     "status": "OKKK", 
     "message": "metadata loaded into iRODS successfullyyyyy" 
     } 
    ] 
    } 
} 

उपयोग jq-play चलाने सुखाने के लिए।

+0

के साथ अपडेट किया है क्योंकि लक्ष्य सिर्फ तत्व को जोड़ना है, इसलिए + = का उपयोग करना बेहतर होगा, लेकिन यह ध्यान देने योग्य है कि '.data.messages [3] | =। + एक्स' यहां '.data.messages [3] = X' के लिए सरलीकृत किया जा सकता है क्योंकि आरएचएस पर '.' प्रभावी रूप से केवल' शून्य 'है। – peak

+0

(यहां विंडोज़ जेक्यू उपयोगकर्ता): मुझे आश्चर्य है कि इस नए डेटा को एक ही (इनपुट) फ़ाइल में लिखना संभव है, अस्थायी फ़ाइल बनाने के बजाय जिसे बाद में बदला जाना चाहिए .. –

+0

@ script'n'code - उपयोग करना यदि स्पॉन्ग है तो शायद यह सबसे अच्छा विकल्प है या इसे इंस्टॉल कर सकता है (यह अधिक से अधिक का हिस्सा है)। – peak

12

बजाय यहां |= का उपयोग कर, यह बहुत += उपयोग करने के लिए बेहतर है:

.data.messages += [{"date": "2010-01-07T19:55:99.999Z", 
    "xml": "xml_samplesheet_2017_01_07_run_09.xml", 
    "status": "OKKK", "message": "metadata loaded into iRODS successfullyyyyy"}] 
संबंधित मुद्दे