返回

JQ中如何保留匹配记录之间的逗号分隔

windows

如何在 JQ 中保留匹配记录之间的逗号分隔

问题

在使用 JQ 命令行 JSON 处理器处理 JSON 文件时,你可能会遇到以下问题:当检索特定位置的匹配项时,输出的 JSON 对象会丢失逗号分隔符。

解决方案

为了保留匹配记录之间的逗号分隔,你需要使用 JQ 的 reduce 函数。该函数将数组中的每个元素作为参数,并使用指定的操作对其进行累积。

修改后的 JQ 命令

输出带有逗号分隔符的 JSON 对象:

jq ".[] | reduce .[] as $item ([]; . + $item + ",") | del(.[-1:])" sample.json

输出带有逗号分隔符的 JSON 数组:

jq ".[] | reduce .[] as $item ([][]; . + [$item]) | del(.[-1:])" sample.json

详细说明

  • reduce 函数使用逗号分隔符累积匹配的 JSON 对象或数组元素。
  • del(.[-1:]) 函数删除逗号分隔符,保留最后一个元素。

示例

考虑以下示例 JSON 文件:

[
    {
      "name": "Bob",
      "location": "New York"
    },
    {
      "name": "Adam",
      "location": "Los Angeles"
    },
    {
      "name": "Jill",
      "location": "Chicago"
    }
]

输出带有逗号分隔符的 JSON 对象:

{
  "name": "Bob",
  "location": "New York"
},{
  "name": "Adam",
  "location": "Los Angeles"
}

输出带有逗号分隔符的 JSON 数组:

[
  {
      "name": "Bob",
      "location": "New York"
  },
  {
      "name": "Adam",
      "location": "Los Angeles"
  }
]

常见问题解答

问:为什么需要使用 reduce 函数?
答: reduce 函数允许你累积匹配的 JSON 对象或数组元素,并使用逗号分隔符将它们组合在一起。

问:为什么需要使用 del(.[-1:]) 函数?
答: del(.[-1:]) 函数删除最后的逗号分隔符,使输出更具可读性。

问:我可以使用 reduce 函数执行哪些其他操作?
答: reduce 函数是一个强大的函数,可以执行各种操作,例如求和、连接和筛选。

问:如何自定义逗号分隔符?
答: 你可以使用 + ; 运算符来定义自定义的分隔符。例如,要使用分号作为分隔符,可以使用以下命令:

jq ".[] | reduce .[] as $item ([]; . + $item + ";")" sample.json

结论

通过使用 reduce 函数,你可以轻松地在 JQ 输出中保留匹配记录之间的逗号分隔。这使得在命令行中显示结果或将其输出到新文件时更加灵活。