Json jq筛选器通过比较内部对象来删除重复项

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",

我正在尝试将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", "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
的最大优势(例如vs
unique
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
的最大优势(例如vs
unique
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,这就是为什么会有错误。