JQ

2017-02-05 11 views
5

यह एक बहुत ही बुनियादी (शायद मूर्ख) सवाल है, लेकिन मैं यह काम करने के लिए नहीं मिल सकता है के साथ फ़ील्ड नाम मिलान पैटर्न ...JQ

मैं इस संरचना

{                                                            
    "data": { 
     "what a burger": [1,2,3], 
     "wap": [66], 
     "the map": [11,20], 
     "H. Incandenza": [1,1], 
     "What a burger": [a,a,3] 
    } 
} 

साथ एक json फ़ाइल है और मैं डेटा के भीतर फ़ील्ड के मान निकालना चाहता हूं जिसका "नाम" एक निश्चित पैटर्न से मेल खाता है। उदाहरण के लिए, मैं पाने के लिए

[1,2,3], [एक, एक, 3]

कुछ मेरा अनुमान होगा "क्या एक बर्गर" के सभी केस-संवेदी संयोग को निकालने के लिए चाहते हैं जैसे

jq '.data | match("what a burger";"i")' 

लेकिन इस

jq: error (at <stdin>:9): object ({"what a bu...) cannot be matched, as it is not a string 

चीयर्स का परिणाम है।

उत्तर

2

आपका कथन काम नहीं करता है, क्योंकि आप डेटा ऑब्जेक्ट को मैच में फ़ीड करने का प्रयास करते हैं, लेकिन मैच केवल तारों पर काम कर सकता है।

निम्न अभिव्यक्ति जो आप चाहें वह करेगी। to_entries ऑब्जेक्ट को कुंजी और मानों की सरणी में परिवर्तित करता है। फिर हम map और select सभी प्रविष्टियों को .key (अब एक स्ट्रिंग) का उपयोग करके match का उपयोग करके इस सरणी पर फिर से शुरू करते हैं। अंत में हम सिर्फ हर तत्व के मूल्य को मुद्रित करते हैं।

.data | to_entries | map(select(.key | match("what a burger";"i"))) | map(.value) 

हालांकि, दो टिप्पणियां:

  • [a,a,3], JSON में अनुमति नहीं है क्योंकि a कोई अंक नहीं है।
  • यह काम करता है क्योंकि चाबियाँ वास्तव में अलग होती हैं, भले ही केवल अक्षर का मामला बराबर न हो। यदि कम से कम दो कुंजी समान हैं, तो आप समस्याओं में भाग लेंगे, क्योंकि कुंजी अद्वितीय होनी चाहिए। वास्तव में, jq तब केवल तत्वों में से एक को आउटपुट करेगा।
+1

दो 'map' कॉल:

.data | with_entries(select(.key|match("what a burger";"i")))[] 

इनपुट सुधार, और JQ के -c विकल्प का उपयोग करने के बाद, इस दो पंक्तियों का उत्पादन होगा संयुक्त कर सकते हैं और किया जाना चाहिए। –

5

यहाँ खनन एक से थोड़ा विकल्प है:

[1,2,3] 
["a","a",3] 
+0

मुझे यह पसंद है, और मुझे सभी कुंजी प्राप्त करने में मदद मिली: मानों में यदि कुंजी में एक पैटरन (या uniq) सभी मानों के लिए जहां कुंजी नाम "keynameSOMETHING" '.data | with_entries (चयन करें (.key | match ("keyname +"; "ig"))) [] ' कुंजी के लिए: उसी फ़ाइलर के साथ मूल्य हम अंत में [] को हटा दें ... और अगर मैं चाहता हूं तो भी काम करता है कुंजी नाम में एक से अधिक PATTERN को खोजने के लिए: '.data | with_entries (चुनें (.key | match ("include1 +", "include2 +"; "ig"))) बिना सुझाव के इसे किया जा सकता है हालांकि @peak तो धन्यवाद – Mikec

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