gpt4 book ai didi

jq - 如何使用 |添加并保留具有不同值的重复键,将它们添加到数组中

转载 作者:行者123 更新时间:2023-12-04 07:26:35 24 4
gpt4 key购买 nike

我试图采用两个相似的 JSON 对象并将它们组合起来,因为它们代表同一事物的两个版本。到目前为止,我有一个相当简单的解决方案,只需使用“添加”即可。但是,这消除了具有不同值的重复键,并且显然选择的值是随机选择的。我想要的结果是,如果一个键的值存在于两个地方但不同,它们应该被放入一个数组中,然后该数组就是该键的值。还应添加存在于一个中但不存在于另一个中的任何键。最后,对于存在于两个地方的任何键,如果值相同,则该项目应该只有一个键/值。例如:
对象 A:

{ 
"primaryKey":"thisValueIsTheSameInBoth",
"aOnlyField":"thisIsOnlyInA",
"sharedField":"thisIsInBoth-AAA",
"sharedField2":"thisIsInBothAgain-AAA"
}
对象 B:
{
"primaryKey":"thisValueIsTheSameInBoth",
"bOnlyField":"thisIsOnlyInB",
"sharedField":"thisIsInBothButDifferentInB",
"sharedField2":"thisIsInBothAgainButStillDifferentInB"
}
目前我正在这样做:
<bunch_of_Bash_commands> | jq -n '[inputs] | add'
不幸的是,结果如下:
{
"primaryKey":"thisValueIsTheSameInBoth",
"aOnlyField":"thisIsOnlyInA",
"bOnlyField":"thisIsOnlyInB",
"sharedField":"thisIsInBoth-AAA",
"sharedField2":"thisIsInBothAgain-AAA"
}
如您所见,它可以很好地组合两者中不存在的字段,但任意决定为所有不同的共享字段选择 A 的值。我想将这些不同的值放在一个数组中而不是一个字符串中。有没有一种干净,简单的方法来做到这一点?
期望的输出:
{
"primaryKey":"thisValueIsTheSameInBoth",
"aOnlyField":"thisIsOnlyInA",
"bOnlyField":"thisIsOnlyInB",
"sharedField" : [ "thisIsInBoth-AAA", "thisIsInBothButDifferentInB" ],
"sharedField2" : [ "thisIsInBothAgain-AAA", "thisIsInBothAgainButStillDifferentInB" ]
}

最佳答案

以下代码执行您正在寻找的操作。
这个想法是在第一步中收集数组中所有键的值(也为只出现一次的键),最后从所有数组中删除重复项并解包只有一个元素的数组。
对于大量对象,这可能是性能不佳的解决方案。

#!/bin/bash     

object_a='
{
"primaryKey":"thisValueIsTheSameInAll",
"aOnlyField":"thisIsOnlyInA",
"sharedField":"thisIsInAllWithSameValue",
"sharedField2":"thisIsInAllButDifferentValue-A",
"thing":["hello","hi"]
}'

object_b='
{
"primaryKey":"thisValueIsTheSameInAll",
"bOnlyField":"thisIsOnlyInB",
"sharedField":"thisIsInAllWithSameValue",
"sharedField2":"thisIsInAllButDifferentValue-B",
"thing":["hola","bonjour"]
}'

object_c='
{
"primaryKey":"thisValueIsTheSameInAll",
"sharedField":"thisIsInAllWithSameValue",
"sharedField2":"thisIsInAllButDifferentValue-C"
}'

echo "$object_a $object_b $object_c" |
jq -n '
reduce inputs as $input
({}; reduce ($input | keys_unsorted)[] as $key
(.; .[$key] += [$input[$key]])
)
| with_entries(.value |= (flatten
| unique
| if length == 1 then .[0] else . end)
)'
结果:
{
"primaryKey": "thisValueIsTheSameInAll",
"aOnlyField": "thisIsOnlyInA",
"sharedField": "thisIsInAllWithSameValue",
"sharedField2": [
"thisIsInAllButDifferentValue-A",
"thisIsInAllButDifferentValue-B",
"thisIsInAllButDifferentValue-C"
],
"thing": [
"bonjour",
"hello",
"hi",
"hola"
],
"bOnlyField": "thisIsOnlyInB"
}

关于jq - 如何使用 |添加并保留具有不同值的重复键,将它们添加到数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68184175/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com