यहाँ इनपुट JSON फ़ाइलें हैं:

input.json

[
   {
      "Id":"123456"
   },
   {
      "Id":"7890123"
   }
]

array.json

[
   {
      "DataId":"{{ID}}"
   },
   {
      "DataId":"{{ID}}"
   }
]

मैं इनपुट फ़ाइल से आईडी के साथ सरणी JSON में प्लेसहोल्डर्स को बदलने और वस्तुओं की नई सरणी बनाने का प्रयास करता हूं।

मैं अब तक यही लेकर आया हूं:

cat input.json | jq '.[] as $inputs |[ $endFile[] + {"DataId": $inputs[]}] ' --argjson endFile "$(<array.json)"

मुझे डुप्लीकेट मिल रहे हैं और मुझे कोई सुराग नहीं है, क्यों:


    [
      {
        "DataId": "123456"
      },
      {
        "DataId": "123456"
      }
    ]
    [
      {
        "DataId": "7890123"
      },
      {
        "DataId": "7890123"
      }
    ]

मुझे केवल मूल्यों के साथ array.json के समान संरचना की आवश्यकता है।

शुक्रिया!

0
Paulus 19 अगस्त 2021, 21:57

2 जवाब

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

मैं सादगी के लिए जाऊंगा, उदा .:

 jq -n '
 (input| map(.Id)) as $ids
 | input
 | reduce range(0; length) as $i (.;
    .[$i].DataId = $ids[$i] )
' input.json array.json
1
peak 20 अगस्त 2021, 06:00

यह मानते हुए कि आपके वास्तविक array.json में वस्तुओं में DataId के अलावा अन्य फ़ील्ड हैं जिन्हें आप अपरिवर्तित से गुजरना चाहते हैं (मैंने एक जोड़ा) ...

$ jq -n '[ inputs ] | transpose | map(.[0] + {DataId: .[1].Id})' array.json input.json
[
  {
    "DataId": "123456"
  },
  {
    "DataId": "7890123",
    "foo": "bar"
  }
]

यह वस्तुओं के सरणियों की एक सरणी बनाकर काम करता है, प्रत्येक उप-सरणी दो इनपुट सरणियों से संबंधित वस्तुओं को धारण करती है, और फिर इसे पुनरावृत्त करती है और प्रत्येक उप-सरणी के लिए, पहली वस्तु के सभी क्षेत्रों के साथ एक वस्तु का निर्माण करती है (से से array.json) लेकिन DataId फ़ील्ड के लिए दूसरी वस्तु से Id का मान।

1
Shawn 20 अगस्त 2021, 03:19