我在使用jq过滤和更新json文件的内容时遇到问题。我需要根据特定值过滤json数据,并根据该过滤条件编辑其他值并增加其他值
我尝试使用
jq '.[] | select (."name"| contains("CHANNEL1"))'
要过滤,但结果缺少顶部键“ x-ID.0”信息,结果如下:
{
"_file.name": "filename.ext",
"name": "CHANNEL1 HD TV",
"logo": "file.png",
"x-channelID": "726"
}
{
"_file.m3u.name": "filename.ext",
"name": "CHANNEL1 SD",
"logo": "file.png",
"x-channelID": "726"
}
对于重新编号,我已经测试了以下功能,并且效果很好
jq -n -s '[ foreach inputs[] as $i (100; .+1; $i*{"x-channelID":(.-1)}) ]'
这是原始的json文件
{
"x-ID.0": {
"_file.name": "filename.ext",
"name": "CHANNEL1 HD TV",
"logo": "file.png",
"x-channelID": "726"
},
"x-ID.2": {
"_file.m3u.name": "filename.ext",
"name": "CHANNEL2",
"logo": "file.png",
"x-channelID": "106"
},
"x-ID.3": {
"_file.m3u.name": "filename.ext",
"name": "CHANNEL3 SD",
"logo": "file.png",
"x-channelID": "236"
},
"x-ID.4": {
"_file.m3u.name": "filename.ext",
"name": "CHANNEL1 SD",
"logo": "file.png",
"x-channelID": "726"
},
"x-ID.5": {
"_file.m3u.name": "filename.ext",
"name": "CHANNEL2 HD",
"logo": "file.png",
"x-channelID": "726"
}
}
这是预期的结果
{
"x-ID.0": {
"_file.m3u.name": "filename.ext",
"name": "CHANNEL1 HD",
"logo": "CHANNEL1.png",
"x-channelID": "100"
},
"x-ID.4": {
"_file.m3u.name": "filename.ext",
"name": "CHANNEL1 SD",
"logo": "CHANNEL1.png",
"x-channelID": "101"
}
}
感谢您的帮助!
答案 0 :(得分:0)
您可以使用以下内容:
to_entries | map(select(.value.name|strings|contains("CHANNEL1"))) | [foreach .[] as $keyvalue (99; .+1; { key: $keyvalue.key, value: ($keyvalue.value + {"x-channelID": .})})] | from_entries
to_entries
将您的对象映射到{ key: "key", value: "value" }
个项目的数组中。
map(select(filter))
过滤那些符合您条件的值。
然后,我们使用foreach
递增计数器,同时迭代其余的键/值对,并使用计数器更新值的x-channelID字段。
最后,我们使用from_entries
从键/值对数组中重新创建所需的对象。
您可以try it here。