Json jq筛选器通过比较内部对象来删除重复项
我正在尝试将JSON行转换为JSON,并在这个过程中尝试通过比较对象的值来查找和删除重复项 例如:Json jq筛选器通过比较内部对象来删除重复项,json,object,duplicates,jq,Json,Object,Duplicates,Jq,我正在尝试将JSON行转换为JSON,并在这个过程中尝试通过比较对象的值来查找和删除重复项 例如: {"headline": "sample headline 1", "title": "sample title 1", "href": "sample link 1", "day": " Fri, 7 Jul 2017 , 8:30PM ", "tags": "tag1"} {"headline": "sample headline 2", "title": "sample title 2",
{"headline": "sample headline 1", "title": "sample title 1", "href": "sample link 1", "day": " Fri, 7 Jul 2017 , 8:30PM ", "tags": "tag1"}
{"headline": "sample headline 2", "title": "sample title 2", "href": "sample link 2", "day": " Fri, 7 Jul 2017 , 8:30PM ", "tags": "tag2"}
{"headline": "sample headline 3", "title": "sample title 3", "href": "sample link ", "day": " Fri, 7 Jul 2017 , 8:30PM ", "tags": "tag3"}
{"headline": "sample headline 4", "title": "sample title 1", "href": "sample link 4", "day": " Fri, 7 Jul 2017 , 8:30PM ", "tags": "tag4"}
现在我想比较第一行和第四行的title
,如果标题相同,我想省略其中一个条目
我只能通过比较所有对象将其转换为JSON并删除重复项:
jq --slurp [.[]] | unique
但这会比较里面的所有对象,而我只想比较一个对象并删除整条线。我该怎么做呢?换句话说:
。。为了比较第一行和第四行的标题,如果标题相同,我想省略其中一个条目
在jq:
jq -s 'if .[0].title == .[3].title then del(.[0]) else . end'
INDEX(.title) | [.[]]
简言之: 查找并删除重复项[基于.title] 在jq:
jq -s 'if .[0].title == .[3].title then del(.[0]) else . end'
INDEX(.title) | [.[]]
除了简洁之外,这里使用INDEX/1
的最大优势(例如vsunique
或group\u by
)是它不会产生排序成本
(如果您的jq没有索引
,只需从中复制其定义即可)
使用-f选项 假设您有jq 1.5,并且名为program.jq的文件包含以下文本:
def INDEX(stream; idx_expr):
reduce stream as $row ({};
.[$row|idx_expr|
if type != "string" then tojson
else .
end] |= $row);
def INDEX(idx_expr): INDEX(.[]; idx_expr);
INDEX(.title) | [.[]]
您可以按如下方式调用jq:
jq -s -f program.jq input
其中“input”是包含JSON行(或JSON流)的文件名
jq 1.4
如果您只能访问jq 1.4,则可以使用以下变体:
def INDEX(stream; idx_expr):
reduce stream as $row ({};
.[$row|idx_expr|
if type != "string" then tojson
else .
end] |= $row);
INDEX(.[]; .title) | [.[]]
jq 1.3
JQ1.3非常过时,但是如果您无法升级,那么就目前而言,使用上面的版本就足够了,将tojson
替换为tostring
。甚至只是:
def INDEX(f): map( {(f|tostring): . } ) | add;
简言之:
。。为了比较第一行和第四行的标题,如果标题相同,我想省略其中一个条目
在jq:
jq -s 'if .[0].title == .[3].title then del(.[0]) else . end'
INDEX(.title) | [.[]]
简言之: 查找并删除重复项[基于.title] 在jq:
jq -s 'if .[0].title == .[3].title then del(.[0]) else . end'
INDEX(.title) | [.[]]
除了简洁之外,这里使用INDEX/1
的最大优势(例如vsunique
或group\u by
)是它不会产生排序成本
(如果您的jq没有索引
,只需从中复制其定义即可)
使用-f选项 假设您有jq 1.5,并且名为program.jq的文件包含以下文本:
def INDEX(stream; idx_expr):
reduce stream as $row ({};
.[$row|idx_expr|
if type != "string" then tojson
else .
end] |= $row);
def INDEX(idx_expr): INDEX(.[]; idx_expr);
INDEX(.title) | [.[]]
您可以按如下方式调用jq:
jq -s -f program.jq input
其中“input”是包含JSON行(或JSON流)的文件名
jq 1.4
如果您只能访问jq 1.4,则可以使用以下变体:
def INDEX(stream; idx_expr):
reduce stream as $row ({};
.[$row|idx_expr|
if type != "string" then tojson
else .
end] |= $row);
INDEX(.[]; .title) | [.[]]
jq 1.3
JQ1.3非常过时,但是如果您无法升级,那么就目前而言,使用上面的版本就足够了,将tojson
替换为tostring
。甚至只是:
def INDEX(f): map( {(f|tostring): . } ) | add;
当索引未定义时,您能帮我提供确切的代码吗。因此,根据标题查找并删除重复项。索引(.title)|[.]]返回并出错。我是jq的新手。ThanksI尝试使用上述代码时出现以下错误:如果类型为,则未定义tojson!=“string”然后是tojson^^^^错误:索引参数太多(应为1,但得到2)def INDEX(idx_expr):INDEX(.[];idx_expr);^^^2.编译错误很多。工作完美。我的版本确实是1.3,这就是为什么会出现错误的原因。当没有定义索引时,您能帮我提供准确的代码吗。因此,根据标题查找并删除重复项。索引(.title)|[.]]返回并出错。我是jq的新手。ThanksI尝试使用上述代码时出现以下错误:如果类型为,则未定义tojson!=“string”然后是tojson^^^^错误:索引参数太多(应为1,但得到2)def INDEX(idx_expr):INDEX(.[];idx_expr);^^^2.编译错误很多。工作完美。我的版本确实是1.3,这就是为什么会有错误。