[英]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.