使用jq对json去重的一个小细节

jq是一个操作json的非常好的工具,这里记录一下使用jq去重踩到的一个坑

例一

  • json文件内容如下
admin@pc-1:~$ cat raw_0.json 
{
    "cid": 100,
    "info": {
        "desc": "this is 100",
        "color": "green"
    }
}
{
    "cid": 200,
    "info": {
        "desc": "this is 200",
        "color": "red"
    }
}
{
    "cid": 100,
    "info": {
        "desc": "this is 100",
        "color": "green"
    }
}
admin@pc-1:~$ 
  • 注意:
    • 开头结尾没有用"[“和”]"包裹起来
    • item之间没有用逗号隔开
  • 使用jq根据"cid"去重正常
admin@pc-1:~$  jq -s 'unique_by(.cid)' raw_0.json 
[
 {
   "cid": 100,
   "info": {
     "desc": "this is 100",
     "color": "green"
   }
 },
 {
   "cid": 200,
   "info": {
     "desc": "this is 200",
     "color": "red"
   }
 }
]
admin@pc-1:~$ 

例二

  • json文件内容如下,这个应该是json的标准格式,有"[]",有逗号分隔
admin@pc-1:~$ cat raw_1.json 
[
    {
        "cid": 100,
        "info": {
            "desc": "this is 100",
            "color": "green"
        }
    },
    {
        "cid": 200,
        "info": {
            "desc": "this is 200",
            "color": "red"
        }
    },
    {
        "cid": 100,
        "info": {
            "desc": "this is 100",
            "color": "green"
        }
    }
]
admin@pc-1:~$ 
  • 还用原来的命令会报错
admin@pc-1:~$  jq -s 'unique_by(.cid)' raw_1.json 
jq: error (at raw_1.json:23): Cannot index array with string "cid"
admin@pc-1:~$ 
  • 需要去掉"-s",就可以正常去重了
admin@pc-1:~$ jq 'unique_by(.cid)' raw_1.json 
[
  {
    "cid": 100,
    "info": {
      "desc": "this is 100",
      "color": "green"
    }
  },
  {
    "cid": 200,
    "info": {
      "desc": "this is 200",
      "color": "red"
    }
  }
]
admin@pc-1:~$ 
  • 看一下命令行帮助
admin@pc-1:~$ jq -h | grep "\-s "
  -s               read (slurp) all inputs into an array; apply filter to it;
admin@pc-1:~$ 
  • 有趣的是可以从raw_1.json转成raw_0.json的格式
admin@pc-1:~$ cat raw_1.json | jq '.[]'
{
  "cid": 100,
  "info": {
    "desc": "this is 100",
    "color": "green"
  }
}
{
  "cid": 200,
  "info": {
    "desc": "this is 200",
    "color": "red"
  }
}
{
  "cid": 100,
  "info": {
    "desc": "this is 100",
    "color": "green"
  }
}
admin@pc-1:~$ 
参考资源链接:[使用jq在Shell命令行高效处理JSON数据](https://wenku.csdn.net/doc/64531d49ea0840391e76e489?utm_source=wenku_answer2doc_content) 在Shell命令行中使用jq工具进行高级查询和转换,你可以利用jq提供的丰富功能来提取、修改和操作JSON数据。例如,要实现高级查询,你可以使用jq的过滤器、map函数和select函数来根据特定条件筛选数据。而要进行转换操作,你可以利用jq的高级操作符如+、-、*、/来执行数学运算,或者使用内置函数如length、keys、values来处理JSON结构。 举个例子,假设我们有一个包含多个对象的JSON数组,并且我们想要筛选出其中某个字段符合特定值的对象。使用jq的select函数可以轻松完成这个任务,如:`% jq 'map(select(.age > 30))' people.json`。这条命令会返回people.json中所有年龄大于30的人的信息。 如果需要进行转换操作,比如计算数组中所有数字的平均值,可以使用jq的内置函数,如下所示:`% jq 'map(.age) | add / length' people.json`。这条命令将提取每个人的年龄,计算总和,然后除以人数,得到平均年龄。 此外,jq还支持使用变量和自定义函数进行复杂的数据处理。例如,你可以定义一个函数来格式化日期,然后在查询中使用它。 通过使用jq在Shell命令行对JSON数据进行高级查询和转换,你可以极大地提升工作效率和数据处理的灵活性。更多高级操作和示例,可以参考《使用jq在Shell命令行高效处理JSON数据》这本书,它详细介绍了jq的各种用法和技巧,对于提高处理JSON数据的能力大有帮助。 参考资源链接:[使用jq在Shell命令行高效处理JSON数据](https://wenku.csdn.net/doc/64531d49ea0840391e76e489?utm_source=wenku_answer2doc_content)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值