删除不匹配项并添加缺少的json jq
嗨,我有两个文件,例如: file1.json删除不匹配项并添加缺少的json jq,json,shell,sed,jq,Json,Shell,Sed,Jq,嗨,我有两个文件,例如: file1.json { "id": "001", "name" : "my_policy", "list_1": ["111111111", "22222222","33333333"], "list_2": ["a", "b",&q
{
"id": "001",
"name" : "my_policy",
"list_1": ["111111111", "22222222","33333333"],
"list_2": ["a", "b","c"],
.....
}
然后是file2.json(不总是与f1具有相同的字段)
我如何通过jq合并两个文件json中的相同键值,以及如何通过合并操作从file1键中删除file2中不存在的值?
所以得到这个结果:
{
"id": "001",
"policy" : "my_policy",
"list_1": ["111111111","111111122","33333333"],
"list_2": ["a", "b","c","d","e"],
.....
}
我通过以下方式解决了合并操作:
jq -s 'reduce .[] as $item ({}; reduce ($item | keys_unsorted[]) as $key (.; $item[$key] as $val | ( $val | type) as $ type | .[$key] = if ( $type == "array") then (.[$key] + $val | unique) elif ($type == "object") then (.[$key] + $val) else $val end ))' file1.json f2.json
我怎样才能解决?或者通过jq是不可能的?一旦你弄清楚如何找出两个列表项之间的差异并添加/唯一它们,这就非常简单了。一种方法是
jq --slurpfile s 2.json -f script.jq 1.json
我的脚本内容在哪里
#!/usr/bin/env jq -f
# backup list_1, list_2 from 1.json
.list_1 as $l1 |
.list_2 as $l2 |
# Perform the operation of removing file1 keys not present in 2.json
# for both list_1 and list_2
( ( $l1 - ( $l1 - $s[].list_1 ) ) + $s[].list_1 | unique ) as $f1 |
( ( $l2 - ( $l2 - $s[].list_2 ) ) + $s[].list_2 | unique ) as $f2 |
# Update the original result 1.json with the modified content
.list_1 |= $f1 |
.list_2 |= $f2
或者直接从命令行执行,如下所示:
jq --slurpfile s 2.json '
.list_1 as $l1 |
.list_2 as $l2 |
( ( $l1 - ( $l1 - $s[].list_1 ) ) + $s[].list_1 | unique ) as $f1 |
( ( $l2 - ( $l2 - $s[].list_2 ) ) + $s[].list_2 | unique ) as $f2 |
.list_1 |= $f1 |
.list_2 |= $f2
' 1.json
是的,这解决了一切。ti是否可以泛化而不是编写列表1、列表2等?或者,如果我显式地编写所有需要更新的json密钥,效果会更好?@mat656:是的,你可以,但这完全是另一个问题。请问一个新问题
jq --slurpfile s 2.json '
.list_1 as $l1 |
.list_2 as $l2 |
( ( $l1 - ( $l1 - $s[].list_1 ) ) + $s[].list_1 | unique ) as $f1 |
( ( $l2 - ( $l2 - $s[].list_2 ) ) + $s[].list_2 | unique ) as $f2 |
.list_1 |= $f1 |
.list_2 |= $f2
' 1.json