【发布时间】:2020-09-13 19:36:53
【问题描述】:
我对 jq 进行了三个操作以获得正确的结果。我怎样才能在一个命令中做到这一点? 这是源 JSON 文件的片段
[
{
"Header": {
"Tenant": "tenant-1",
"Rcode": 200
},
"Body": {
"values": [
{
"id": "0b0b-0c0c",
"name": "NumberOfSearchResults"
},
{
"id": "aaaa0001-0a0a",
"name": "LoadTest"
}
]
}
},
{
"Header": {
"Tenant": "tenant-2",
"Rcode": 200
},
"Body": {
"values": []
}
},
{
"Header": {
"Tenant": "tenant-3",
"Rcode": 200
},
"Body": {
"values": [
{
"id": "cccca0003-0b0b",
"name": "LoadTest"
}
]
}
},
{
"Header": {
"Tenant": "tenant-4",
"Rcode": 200
},
"Body": {
"values": [
{
"id": "0f0g-0e0a",
"name": "NumberOfSearchResults"
}
]
}
}
]
我应用了两个过滤器并创建了两个中间 JSON 文件。首先,我创建所有租户的列表
jq -r '[.[].Header.Tenant]' source.json >all-tenants.json
然后我选择创建一个包含所有租户的数组,这些租户在 Body.values[] 数组中没有特定键:
jq -r '[.[] | select (all(.Body.values[]; .name !="LoadTest") ) ] | [.[].Header.Tenant]' source.json >filter1.json
结果 - all-tenants.json
["tenant-1",
"tenant-2",
"tenant-3",
"tenant-4"
]
filter1.json
["tenant-2",
"tenant-4"
]
然后我从 all-tenants.json 中构造 filter1.json 以获得差异:
jq -r -n --argfile filter filter1.json --argfile alltenants all-tenants.json '$alltenants - $filter|.[]'
结果:
tenant-1
tenant-3
租户名称 - “租户”键的值是唯一的,并且每个值在 source.json 文件中只出现一次。
澄清一下 - 我知道我可以有一个选择条件,它会给我与减去两个数组相同的结果。
我想了解的 - 如何在不涉及中间文件的单个命令中直接将这两个数组分配和使用到 vars 中?
谢谢
【问题讨论】:
标签: arrays json sorting split jq