我有很多这样格式的json文件:
样本file1
:
{
"attributes": [
{
"name": "Node",
"value": "test"
}
]
}
样本file2
:
{
"attributes": [
{
"name": "version",
"value": "11.1"
}
]
}
ETC。
我需要将它们全部合并到一个 json 文件中,例如。
{
"attributes": [
{
"name": "Node",
"value": "test"
},
{
"name": "version",
"value": "11.1"
}
]
}
有人可以提供 jq 的解决方案吗?
答案1
jq
解决方案:
jq -s '{ attributes: map(.attributes[0]) }' file*.json
-s
(--slurp
) - 而不是为每个运行过滤器JSON输入中的对象,将整个输入流读入一个大数组并仅运行一次过滤器。
示例输出:
{
"attributes": [
{
"name": "Node",
"value": "test"
},
{
"name": "version",
"value": "11.1"
}
]
}
答案2
相比之下RomanPerekrest 的解决方案,这将允许您合并目标字段而无需重新创建整个对象:
jq -s '.[0].attributes = [.[].attributes | add] | .[0]' file*.json
这将返回第一个 json 文件的整体,并将.attributes
所有其他文件连接在一起。
答案3
另jq
一种变体,不涉及 slurp,但包含inputs
andreduce
jq -n 'reduce inputs as $in ({}; reduce ($in|keys_unsorted)[] as $k (.;
.[$k] += $in[$k]))' file1 file2
答案4
使用yq
(来自https://kislyuk.github.io/yq/),然后使用tomlq
(来自同一yq
发行版)从 TOML 返回到 JSON:
$ yq -t '.' file1 file2 | tomlq .
{
"attributes": [
{
"name": "Node",
"value": "test"
},
{
"name": "version",
"value": "11.1"
}
]
}
这是有效的,因为yq -t
创建了两个 TOML 文档的串联
[[attributes]]
name = "Node"
value = "test"
和
[[attributes]]
name = "version"
value = "11.1"
一起,按照规则TOML,这恰好相当于您要创建的 JSON 文档(由于attributes
是数组)。因此,当tomlq
将其转换回 JSON 时,它会做正确的事情。
您可以使用该实用程序进行等效转换yj
(来自https://github.com/sclevine/yj) 也:
yj -tj < <( cat <( yj -jt <file1 ) <( yj -jt <file2 ) )
或者,没有过程替换和cat
,
{ yj -jt <file1; yj -jt <file2; } | yj -tj
事实证明,您也可以通过 Hashicorp 的 HCL 格式进行相同类型的往返,分别使用yj -jc
和yj -cj
代替yj -jt
和yj -tj
。