【问题标题】:Get the index of the array element in JSON with jq用jq获取JSON中数组元素的索引
【发布时间】:2023-04-08 08:14:01
【问题描述】:

我有以下类型的 json:

{
  "foo": "hello",
  "bar": [
    {
      "key": "k1",
      "val": "v1"
    },
    {
      "key": "k2",
      "val": "v2"
    },
    {
      "key": "k3",
      "val": "v3"
    }
  ]
}

我想输出以下内容:

"hello", 1, "k1", "v1"
"hello", 2, "k2", "v2"
"hello", 3, "k3", "v3"

我正在使用 jq 来转换它,答案也应该是 jq 转换。

我目前在:

echo '{"foo": "hello","bar": [{"key": "k1","val": "v1"},{"key": "k2","val": "v2"},{"key": "k3","val": "v3"} ]}' | jq -c -r '.bar[] as $b | [.foo, ($b | .key, .val)] | @csv'

这给了我:

"hello","k1","v1"
"hello","k2","v2"
"hello","k3","v3"

如何获取要显示的正在解析的数组元素的索引?

【问题讨论】:

    标签: json csv jq


    【解决方案1】:

    您可以将数组转换为条目以访问索引和值。然后您可以构建 CSV 行。

    $ jq -r '[.foo] + (.bar | to_entries[] | [.key+1,.value.key,.value.val]) | @csv' input.json
    "hello",1,"k1","v1"
    "hello",2,"k2","v2"
    "hello",3,"k3","v3"
    

    【讨论】:

      【解决方案2】:

      假设您可以访问 jq 1.5 并且 key/val 键按该顺序显示:

      jq -r '.foo as $foo 
        | foreach .bar[] as $i (0; .+1; [$foo, .] + [$i[]])
        | @csv'
      

      会产生:

      "hello",1,"k1","v1"
      "hello",2,"k2","v2"
      "hello",3,"k3","v3"
      

      -r 选项通常与 @csv 一起使用,以将原本由 @csv 生成的 JSON 字符串转换为以逗号分隔的值列表。

      如果你真的想加入“,”,那就有点麻烦了,但如果你不担心@csv 提供的功能,这里有一种方法:

      $ jq -r '"\"\(.foo)\"" as $foo
          | foreach .bar[] as $i
              (0; .+1; "\($foo), \(.), \($i | map("\"\(.)\"")|join(", "))")' 
      

      这会产生:

      "hello", 1, "k1", "v1"
      "hello", 2, "k2", "v2"
      "hello", 3, "k3", "v3"
      

      如果您的 jq 没有foreach,那么您可以类似地使用reduce,但升级可能更容易。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-16
        • 2014-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-14
        相关资源
        最近更新 更多