Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 交换键和值以及累积值_Json_Linux_Key Value_Reduce_Jq - Fatal编程技术网

Json 交换键和值以及累积值

Json 交换键和值以及累积值,json,linux,key-value,reduce,jq,Json,Linux,Key Value,Reduce,Jq,我有以下JSON片段: { "a": [ 1, "a:111" ], "b": [ 2, "a:111", "irrelevant" ], "c": [ 1, "a:222" ], "d": [ 1, "b:222" ], "e": [ 2, "b:222", "irrelevant"] } 我想用数组的第二个值交换键,并用相同的值累积键,丢弃第二个值之后可能出现的值: { "a:111": [ [ 1, "a" ], [ 2, "b" ] ], "a:222": [

我有以下JSON片段:

{
  "a": [ 1, "a:111" ],
  "b": [ 2, "a:111", "irrelevant" ],
  "c": [ 1, "a:222" ],
  "d": [ 1, "b:222" ],
  "e": [ 2, "b:222", "irrelevant"]
}
我想用数组的第二个值交换键,并用相同的值累积键,丢弃第二个值之后可能出现的值:

{ "a:111": [ [ 1, "a" ], [ 2, "b" ] ],
  "a:222": [ [ 1, "c" ] ],
  "b:222": [ [ 1, "d" ], [ 2, "e" ] ]
}
我的初步解决方案如下:

echo  '{
      "a": [ 1, "a:111" ],
      "b": [ 2, "a:111", "irrelevant" ],
      "c": [ 1, "a:222" ],
      "d": [ 1, "b:222" ],
      "e": [ 2, "b:222", "irrelevant"]
    }' \
| jq 'to_entries
| map({(.value[1]|tostring) : [[.value[0], .key]]})
| reduce .[] as $o ({}; reduce ($o|keys)[] as $key (.; .[$key] += $o[$key]))'

这会产生所需的结果,但可能不是非常健壮、难以阅读且过长。我想有一种使用with_条目的更具可读性的解决方案,但目前我还没有找到它。

Short
jq
方法:

jq 'reduce to_entries[] as $o ({};
    .[$o.value[1]] += [[$o.value[0], $o.key]])' input.json
输出:

{
  "a:111": [
    [
      1,
      "a"
    ],
    [
      2,
      "b"
    ]
  ],
  "a:222": [
    [
      1,
      "c"
    ]
  ],
  "b:222": [
    [
      1,
      "d"
    ],
    [
      2,
      "e"
    ]
  ]
}

谢谢现在看起来好多了:-)