如何使用 jq 重新格式化 json 中的特定数据

Posted

技术标签:

【中文标题】如何使用 jq 重新格式化 json 中的特定数据【英文标题】:How to reformat specific data from json with jq 【发布时间】:2020-09-07 02:43:36 【问题描述】:

我是 json 新手,想从特定的 json 中提取数据(块)。我试图找到有关如何使用 jq 执行此操作的信息,但到目前为止我似乎无法得到我想要的。

我的 json:


   "now" : 1589987097.9,
   "aircraft" : [
      
         "mlat" : [],
         "rssi" : -26.2,
         "track" : 319,
         "speed" : 354,
         "messages" : 16,
         "seen" : 0.7,
         "altitude" : 38000,
         "vert_rate" : 0,
         "hex" : "44b5b4",
         "tisb" : []
      ,
      
         "squawk" : "6220",
         "altitude" : 675,
         "seen" : 1.1,
         "messages" : 7220,
         "tisb" : [],
         "hex" : "484a95",
         "mlat" : [],
         "rssi" : -22
      ,
      
         "hex" : "484846",
         "tisb" : [],
         "messages" : 20,
         "speed" : 89,
         "seen" : 0.4,
         "squawk" : "7000",
         "altitude" : 500,
         "rssi" : -23.7,
         "track" : 185,
         "mlat" : []
      ,
      
         "category" : "B1",
         "mlat" : [],
         "rssi" : -24.3,
         "flight" : "ZSGBX   ",
         "altitude" : 3050,
         "squawk" : "7000",
         "seen" : 16.8,
         "messages" : 37,
         "tisb" : [],
         "hex" : "00901a"
      
 ],
   "messages" : 35857757
 

我想将此 json 重新格式化为包含包含特定十六进制值的“块”。

例如,我希望我的输出包含 44b5b4 和 00901a:



   "now" : 1589987097.9,
   "aircraft" : [
      
         "mlat" : [],
         "rssi" : -26.2,
         "track" : 319,
         "speed" : 354,
         "messages" : 16,
         "seen" : 0.7,
         "altitude" : 38000,
         "vert_rate" : 0,
         "hex" : "44b5b4",
         "tisb" : []
      ,
      
         "category" : "B1",
         "mlat" : [],
         "rssi" : -24.3,
         "flight" : "ZSGBX   ",
         "altitude" : 3050,
         "squawk" : "7000",
         "seen" : 16.8,
         "messages" : 37,
         "tisb" : [],
         "hex" : "00901a"
      
 ],
   "messages" : 35857757


谁能告诉我如何删除所有没有这 2 个十六进制标识符但仍保持相同 json 结构的项目?

非常感谢!

【问题讨论】:

【参考方案1】:

选择hex 与特定值之一匹配的,然后更新aircraft 以仅保留这些值。

.aircraft |= map(select(.hex | IN("44b5b4", "00901a")))

Online demo

【讨论】:

【参考方案2】:

在数组aircraft 上执行select(),仅匹配所需的十六进制值。 map() 函数接受整个数组的输入,选择操作的结果,即基于.hex 值的对象过滤将|= 更新回原始数组,其余字段保持不变。

jq '.aircraft |= map(select(.hex == "44b5b4" or .hex == "00901a"))' json

【讨论】:

以上是关于如何使用 jq 重新格式化 json 中的特定数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 jq 就地修改 json 中的键值

使用 jq 在 JSON 中连接 2 个字段

如何使用 jq 将 JSON 字符串格式化为表格?

如何使用 jq 将任意简单 JSON 转换为 CSV?

关于使用jq 处理json格式的简单笔记

如何通过 jq 中这些键的键和值对 json 文件进行排序