对两个文件运行相同jq管道并对比结果,能否简化为单条jq命令?
单条jq实现Schema版本标签差集查询
你原来的命令作用是提取9.0版本schema中存在、但13.0版本中不存在的rdfs:label值,完全可以简化为单条jq命令,无需额外依赖comm、进程替换和排序流程。
简化后命令
jq -n ' # 先读取13.0版本的所有非空label存入哈希集合 input | .["@graph"][]."rdfs:label" | select(. != null) as $label_v13 | reduce $label_v13[] as $k ({}; .[$k] = 1) as $exist_set # 再读取9.0版本的label,筛选出不在集合中的值输出 | input | .["@graph"][]."rdfs:label" | select(. != null and in($exist_set) | not) ' 13.0/schemaorg-all-http.jsonld 9.0/schemaorg-all-http.jsonld
命令说明
-n参数禁止jq默认读取第一个输入自动处理,方便手动控制两个文件的读取顺序- 先读取13.0版本文件,将所有非空
rdfs:label存入一个键为label值的对象作为哈希集合,查找效率远高于数组遍历 - 再读取9.0版本文件,逐个提取
rdfs:label,筛选出不在上述集合中的值直接输出 - 省略了两次排序和
comm调用,大文件场景下执行效率提升明显
内容的提问来源于stack exchange,提问作者chx
相关产品推荐
相关产品推荐

