एक शेल स्क्रिप्ट में (मान लें master_script.sh), मैं jq का उपयोग करके json फ़ाइल (country.json) को पार्स करने का प्रयास कर रहा हूं और उन मानों को किसी अन्य शेल स्क्रिप्ट (child_script.sh) में पास कर रहा हूं। child_script से मानों को प्रिंट करें क्योंकि मैं इसे वहां उपयोग करूंगा।

master_script.sh

#!/bin/bash
$(jq -r ' .countries[] | .country as $cntry | .city[] | (.) as $ct |
"child_script.sh $cntry $ct"' country.json)

देश.जेसन

 {
        "countries": [
            {"country":"India","city":["India1","India2","India3"]},
            {"country":"USA","city":["USA1","USA2","USA3"]}
           
           ]
    }

child_script.sh

#!/bin/bash
country=$1
city=$2
echo "country: $country, city: $city"\n
# I need to use these two variables for further calculation

child_script.sh से वांछित आउटपुट इस तरह होना चाहिए: jqplay

country: India, city: India1
country: India, city: India2
country: India, city: India3
country: USA, city: USA1
country: USA, city: USA2
country: USA, city: USA3

लेकिन मैं इसे हासिल करने में सक्षम नहीं हूं।

1
gaurav sinha 11 जुलाई 2021, 11:26

2 जवाब

सबसे बढ़िया उत्तर

चूंकि कुछ देशों, जैसे "न्यूजीलैंड" के नाम में रिक्त स्थान हैं, आप शायद इसे ध्यान में रखना चाहेंगे, उदा। निम्नलिखित नुसार:

jq -r '.countries[]
       | .country as $country
       | .city[] | "\($country)\t\(.)"' | 
  while IFS=$'\t' read -r country city; do
     ./child_script.sh "$country" "$city"
  done
2
peak 11 जुलाई 2021, 09:08

while read सामान्य दृष्टिकोण है, लेकिन हम xargs का लाभ उठा सकते हैं क्योंकि लूप बॉडी में एक प्रोग्राम निष्पादित होता है।

jq -r '
   .countries[] |
   .country as $country |
   .city[] |
   @sh "\($country) \(.)"
' country.json |
xargs -rl ./child_script.sh
0
ikegami 12 जुलाई 2021, 00:20