如何将多段jq命令合并为单条实现单次JSON数据遍历?
问题
我现在用两段jq命令从JSON文件提取数据,需要多次遍历输入的JSON,想把它们合并成单条命令实现仅遍历一次:
第一段命令:提取匹配条件的第一个结果(无匹配时输出错误),命令如下:
.[] | select(.[1] | objects."/Type".N == "/Catalog") | .[1]."/Dests"
假设这段命令输出为16876,第二段命令用这个结果进一步提取数据:
.[] | select(.[0] == 16876) | .[1] | to_entries[] | [.key, .value[0], .value[2].F, .value[3].F] | @tsv
解决方案
可以通过变量缓存中间结果,结合first函数和错误处理,实现单次遍历完成所有操作:
first(.[] | select(.[1] | objects."/Type".N == "/Catalog")) as $catalog | if $catalog then $catalog[1]."/Dests" as $dests else error("未找到匹配/Catalog的项") end | .[] | select(.[0] == $dests) | .[1] | to_entries[] | [.key, .value[0], .value[2].F, .value[3].F] | @tsv
核心逻辑:
first(...)直接抓取第一个符合/Catalog条件的项,避免重复筛选- 用
if...else分支处理无匹配的情况,直接抛出错误提示 - 将提取到的目标ID
$dests存入变量,在同一次遍历流程中完成后续的筛选和数据格式化,无需重复读取输入JSON
内容的提问来源于stack exchange,提问作者user119720
相关产品推荐
相关产品推荐

