【问题标题】:Print JSON attributes whose key and value are different打印 key 和 value 不同的 JSON 属性
【发布时间】:2021-07-22 19:13:15
【问题描述】:

我有一个很长的 JSON 文件,其结构如下(没有嵌套属性):

{
    "Aaa aaa aaa": "Aaa aaa aaa",
    "Bbb bbb bbb": "Bbb bbb bbb",
    "Ccc ccc ccc": "Xxx xxx xxx",
    "Ddd ddd ddd": "Ddd ddd ddd",
    "Eee eee eee": "Yyy yyy yyy"
}

我需要打印那些键与值不匹配的对。在这个例子中,我期待这样的结果:

    "Ccc ccc ccc": "Xxx xxx xxx",
    "Eee eee eee": "Yyy yyy yyy"

我知道如何使用 sed...

捕获和打印键和值
sed -n "s/^\t\"\(.*\)\": \"\(.*\)\",\?$/\1 \2/p" file.json

...但我不知道如何在两组之间进行比较。也许 sed 不是这个任务的正确工具,我应该使用 awkjq 代替,但是没有任何经验后者。

因此,在 JSON 文件中搜索名称-值对差异的正确方法或工具是什么?

【问题讨论】:

  • which would be the right way or tool to search differences in name-value pairs within a JSON file? jq 是对 JSON 文件执行任何操作的工具。

标签: json key jq


【解决方案1】:

jq 中,您可以使用with_entries() 函数。它将对象中每条记录的键和值放入命名变量.key.value 中,您基本上必须评估它们是否相同。

jq 'with_entries(select(.key != .value))'

查看手册中的with_entries(..) 了解更多信息


后续问题进行不区分大小写的比较。可以通过将键/值都转换为特定情况来完成

with_entries(select( (.key| ascii_downcase) != (.value| ascii_downcase)))

【讨论】:

  • 非常感谢您的回答,它就像一个魅力!另外我不知道这是否应该是一个不同的问题,但是是否可以使比较不区分大小写?
  • @Serchu:查看更新。如果这不能解决您的问题,请发布代表您的问题的替代输入和输出
  • 您更新的答案完美地解决了我的问题,这正是我所需要的。我以前从未使用过 jq,所以我真的很感谢你这么快就救了我。
【解决方案2】:
sed '/\(\".*\"\): \1/d' file.json

或者如果你还想去掉大括号:

sed '/\"/!d;/\(\".*\"\): \1/d' file.json

【讨论】:

  • 太好了,我不知道您也可以在正则表达式的那一侧使用捕获组,谢谢您的回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-16
  • 2014-01-09
  • 1970-01-01
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多