簡體   English   中英

JSON/JQ:根據條件合並鍵值上的 2 個文件

[英]JSON/JQ: Merge 2 files on key-value with condition

我有 2 個 JSON 文件。 我想使用 jq 從文件 2 中獲取“資本”的值,並將其與文件 1 中出現相同“名稱”-值對的每個元素合並。 否則,文件 2 中的元素不應出現在 output 中。如果文件 1 中的元素沒有“名稱”-值對,則“大寫”應為空文本。

文件 1:

{
   "countries":[
      {
         "name":"china",
         "continent":"asia"
      },
      {
         "name":"france",
         "continent":"europe"
      }
   ]
}

文件 2:

{
   "countries":[
      {
         "name":"china",
         "capital":"beijing"
      },
      {
         "name":"argentina",
         "capital":"buenos aires"
      }
   ]
}

期望的結果:

{
   "countries":[
      {
         "name":"china",
         "continent":"asia",
         "capital":"beijing"
      },
      {
         "name":"france",
         "continent":"europe",
         "capital":""
      }
   ]
}

您可以先從 File2 構建字典,然后執行更新,例如:

jq --argfile dict File2.json '
  ($dict.countries | map( {(.name): .capital}) | add) as $capitals
  | .countries |= map( .capital = ($capitals[.name] // ""))
' File2.json 

從 JSON-esque 的角度來看,使用null來處理缺失值可能會更好; 在這種情況下,您可以通過省略// ""來簡化上述內容。

使用INDEX/2

如果您的 jq 具有INDEX/2 ,則可以使用以下表達式構造 $capitals 字典:

INDEX($dict.countries[]; .name) | map_values(.capital)

使用 INDEX 使意圖更清晰,但如果效率是主要問題,您最好明確使用reduce

reduce $dict.countries[] as $c ({}; . + ($c | {(.name): .capital}))

單程:

$ jq --slurpfile file2 file2.json '
   { countries:
      [ .countries[] |
        . as $curr |
        $curr + { capital: (($file2[0].countries[] | select(.name == $curr.name) | .capital) // "") }
      ]
    }' file1.json
{
  "countries": [
    {
      "name": "china",
      "continent": "asia",
      "capital": "beijing"
    },
    {
      "name": "france",
      "continent": "europe",
      "capital": ""
    }
  ]
}

替代:

 $ jq -n '{ countries: ([inputs] | map(.countries) | flatten | group_by(.name) |
                        map(select(.[] | has("continent")) | add | .capital //= ""))
          }' file[12].json

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM