首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么jq会打印冗余和不匹配的记录,如何修复?

为什么jq会打印冗余和不匹配的记录,如何修复?
EN

Stack Overflow用户
提问于 2020-06-04 23:54:30
回答 1查看 46关注 0票数 0

我有一个json文件,其中包含六个'invoice‘对象,每个对象都是140+行值。我只想看到这六个对象中每个对象的几个值。jq似乎是一个很有前途的解决方案。

我使用的是jq version 1.5-1-a5b5cbe,它可以通过apt的常规存储库获得。

我可以执行cat stripe-invoices-list.json | jq -C '. | {invoice_id: .data[].id,}',它会返回:

代码语言:javascript
运行
复制
{
  "invoice_id": "in_1Gq39HFGUwFHXzvlUOGG3Rv4"
}
{
  "invoice_id": "in_1GpyM1FGUwFHXzvlio9pfaM9"
}
{
  "invoice_id": "in_1GpyHUFGUwFHXzvlHDS727su"
}
{
  "invoice_id": "in_1Gpy4HFGUwFHXzvl6k82godp"
}
{
  "invoice_id": "in_1GpjNjFGUwFHXzvl880gp0o9"
}
{
  "invoice_id": "in_1GSkk7FGUwFHXzvlfWdhcad5"
}

这是有意义的,并且工作正常。这些是六个invoice对象的id。一切都很好,尽管仅仅看到id是没有帮助的。所以..。

我尝试向输出中添加更多数据,但这会产生冗余甚至不正确的输出:

代码语言:javascript
运行
复制
$ cat stripe-invoices-list.json | jq -C '. | {invoice_id: .data[].id, client: .data[].customer_name,}'

结果如下:

代码语言:javascript
运行
复制
{
  "invoice_id": "in_1Gpy4HFGUwFHXzvl6k82godp",
  "client": "client_two"
}
{
  "invoice_id": "in_1Gpy4HFGUwFHXzvl6k82godp",
  "client": "client_three"
}
{
  "invoice_id": "in_1Gpy4HFGUwFHXzvl6k82godp",
  "client": "client_four"
}
{
  "invoice_id": "in_1Gpy4HFGUwFHXzvl6k82godp",
  "client": "client_five"
}
{
  "invoice_id": "in_1Gpy4HFGUwFHXzvl6k82godp",
  "client": "client_one"
}
{
  "invoice_id": "in_1GpjNjFGUwFHXzvl880gp0o9",
  "client": "client_one"
}
{
  "invoice_id": "in_1GpjNjFGUwFHXzvl880gp0o9",
  "client": "client_two"
}
{
  "invoice_id": "in_1GpjNjFGUwFHXzvl880gp0o9",
  "client": "client_three"
}
{
  "invoice_id": "in_1GpjNjFGUwFHXzvl880gp0o9",
  "client": "client_four"
}
{
  "invoice_id": "in_1GpjNjFGUwFHXzvl880gp0o9",
  "client": "client_five"
}
{
  "invoice_id": "in_1GpjNjFGUwFHXzvl880gp0o9",
  "client": "client_one"
}
{
  "invoice_id": "in_1GSkk7FGUwFHXzvlfWdhcad5",
  "client": "client_one"
}
{
  "invoice_id": "in_1GSkk7FGUwFHXzvlfWdhcad5",
  "client": "client_two"
}
{
  "invoice_id": "in_1GSkk7FGUwFHXzvlfWdhcad5",
  "client": "client_three"
}
{
  "invoice_id": "in_1GSkk7FGUwFHXzvlfWdhcad5",
  "client": "client_four"
}
{
  "invoice_id": "in_1GSkk7FGUwFHXzvlfWdhcad5",
  "client": "client_five"
}
{
  "invoice_id": "in_1GSkk7FGUwFHXzvlfWdhcad5",
  "client": "client_one"

这给出了冗余和混乱的信息。它是多余的,因为in_1GSkk7FGUwFHXzvlfWdhcad5被多次列出,并被打乱,因为一个发票与每个客户相关联。

当我在vim中打开stripe-invoices-list.json文件时,可以看到发票id in_1GSkk7FGUwFHXzvlfWdhcad5client_one相关联。

有没有人能建议是什么导致了这个问题,或者我可以采取的任何调试步骤?怎样才能让jq正确地打印出来?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-05 00:03:33

这是一个常见的陷阱,您在同一个对象构造函数中扩展data两次,这会导致combinatorial explosion。下面是正确的方法。

代码语言:javascript
运行
复制
.data[] | {invoice_id: .id, client: .customer_name}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62198965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档