我有兩個要合并在一起的 JSON 檔案,保留第一個檔案中的所有記錄,并根據匹配的鍵欄位值合并第二個檔案中的欄位。
我正在使用jqLinux 上的命令列工具來執行此操作。我可以使用的最新版本jq是:jq-1.5-1-a5b5cbe
這是我的輸入檔案,以及我試圖生成的 JSON:
輸入檔案#1:
input1.json
[
{
"id": "item1",
"join_id": "123",
"field1": "val1",
"field2": "val2"
},
{
"id": "item2",
"join_id": "123", // Same join_id as above
"field1": "val1",
"field2": "val2"
},
{
"id": "item3",
"join_id": "456",
"field1": "val3",
"field2": "val4"
},
{
"id": "item4",
"join_id": "789", // Not found in lookup JSON
"field1": "val5",
"field2": "val6"
}
]
輸入檔案#2:
input2.json
[
{
"joinId": "123",
"joinField1": "AAAAAA",
"joinField2": "BBBBBB"
},
{
"joinId": "456",
"joinField1": "CCCCCC",
"joinField2": "DDDDDD"
}
]
期望的輸出:
[
{
"id": "item1",
"join_id": "123",
"field1": "val1",
"field2": "val2",
"joinId": "123",
"joinField1": "AAAAAA",
"joinField2": "BBBBBB"
},
{
"id": "item2",
"join_id": "123",
"field1": "val1",
"field2": "val2",
"joinId": "123",
"joinField1": "AAAAAA",
"joinField2": "BBBBBB"
},
{
"id": "item3",
"join_id": "456",
"field1": "val3",
"field2": "val4",
"joinId": "456",
"joinField1": "CCCCCC",
"joinField2": "DDDDDD"
},
{
"id": "item4",
"join_id": "789",
"field1": "val5",
"field2": "val6"
}
]
如果joinId, joinField1,joinField2欄位被添加到“item4”記錄中也是可以的,只要它們具有null或為空的字串值。
對此的任何幫助將不勝感激。
uj5u.com熱心網友回復:
使用 jq 1.6,您只需使用INDEXand JOIN:
jq '[JOIN(INDEX(input[]; .joinId); .[]; .join_id; add)]' input1.json input2.json
演示
對于 jq 1.5 解決方案,您可以從Github 存盤庫中獲取這兩個內置函式的定義并在您的代碼中重新實作它們:
jq '
def INDEX(stream; idx_expr):
reduce stream as $row ({}; .[$row|idx_expr|tostring] = $row);
def JOIN($idx; stream; idx_expr; join_expr):
stream | [., $idx[idx_expr]] | join_expr;
[JOIN(INDEX(input[]; .joinId); .[]; .join_id; add)]
' input1.json input2.json
演示
但是,您也可以將這兩個定義相乘以直接適合您的用例:
jq '
(reduce input[] as $row ({}; .[$row.joinId] = $row)) as $idx
| map(. $idx[.join_id])
' input1.json input2.json
演示
輸出:
[
{
"id": "item1",
"join_id": "123",
"field1": "val1",
"field2": "val2",
"joinId": "123",
"joinField1": "AAAAAA",
"joinField2": "BBBBBB"
},
{
"id": "item2",
"join_id": "123",
"field1": "val1",
"field2": "val2",
"joinId": "123",
"joinField1": "AAAAAA",
"joinField2": "BBBBBB"
},
{
"id": "item3",
"join_id": "456",
"field1": "val3",
"field2": "val4",
"joinId": "456",
"joinField1": "CCCCCC",
"joinField2": "DDDDDD"
},
{
"id": "item4",
"join_id": "789",
"field1": "val5",
"field2": "val6"
}
]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/490941.html
