我有数千个 JSON 文件要合并到一个对象中。这些都不是类似的格式。让我详细解释一下。这是 JSON 的第一个示例
[
{
"value 1": 1,
"value 2": 2,
"value 3": 3,
"value 4": 4
}
]
Run Code Online (Sandbox Code Playgroud)
和其他类型不相似,就像下面有几个公共字段和其他字段
[
{
"value 3": 300,
"value 4": 400,
"value 5": 500,
"value 6": 600
}
]
Run Code Online (Sandbox Code Playgroud)
例如我有 2 个具有第一种示例格式的文件和一个具有第二种示例格式的文件。我正在尝试jq
用于合并它。
jq -s '.' *.json > myfile.json
Run Code Online (Sandbox Code Playgroud)
它使用三个不同的对象返回以下内容
[
{
"value 1": 1,
"value 2": 2,
"value 3": 3,
"value 4": 4
}
],
[
{
"value 1": 10,
"value 2": 20,
"value 3": 30,
"value 4": 40
}
],
[
{
"value 3": 300,
"value 4": 400,
"value 5": 500,
"value 6": 600
}
]
Run Code Online (Sandbox Code Playgroud)
我需要将它合并到一个对象中,如下所示,如果有任何jq
选项可以排除那些具有特定字段的文件。类似于排除那些具有字段的文件"value 6"
。所以最后 JSON 输出将是
[
{
"value 1": 1,
"value 2": 2,
"value 3": 3,
"value 4": 4
},
{
"value 1": 10,
"value 2": 20,
"value 3": 30,
"value 4": 40
}
]
Run Code Online (Sandbox Code Playgroud)
您可以使用inputs
将过滤器应用于所有 JSON 文件的内容,并应用选择过滤器。该-n
标志是为了确保输出 JSON 是根据给定的输入从头开始构建的。
jq -n '[ inputs[] | select( has("value 6") | not ) ]' *.json
Run Code Online (Sandbox Code Playgroud)
通过这样做jq -n 'inputs[]'
,所有组成 JSON 文件中的所有对象都可用于 select 函数,该函数丢弃任何包含键字段的对象 as "value 6"
。在[..]
围绕过滤器被放置在阵列内的最终得到的对象。
另一种方法是使用reduce()
函数以迭代方式添加所需的对象
jq -n 'reduce inputs[] as $data (.; . + [ if $data | has("value 6") | not then $data else empty end ] )'
Run Code Online (Sandbox Code Playgroud)