Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除不匹配项并添加缺少的json jq_Json_Shell_Sed_Jq - Fatal编程技术网

删除不匹配项并添加缺少的json jq

删除不匹配项并添加缺少的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

嗨,我有两个文件,例如:

file1.json

{
  "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