【问题标题】:How to print object element for each internal array element in jq如何为jq中的每个内部数组元素打印对象元素
【发布时间】:2020-05-09 18:43:22
【问题描述】:

我的 JSON 看起来像这样:

test.json

[
  {
    "item1": {
      "item2": 123,
      "array1": [
        {
          "item3": 456,
          "item4": "teststring"
        },
        {
          "item3": 789,
          "item4": "teststring2"
        }
      ]
    }
  }
]

我正在尝试按以下格式打印出来:

123, 456, teststring
123, 789, teststring2

我试着这样做:

cat test.json | jq -r '.[].item1.item2, (.[].item1.array1[] | .item3, .item4)' | xargs printf "%s, %s, %s\n"

但是结果是item2被打印出来了,接着是第一行item3item4,然后下一行只打印item3item4,像这样:

123, 456, teststring
789, teststring2, 

如何为从数组内打印的每组元素打印数组外部的元素?

【问题讨论】:

  • 你想要123, 789, teststring还是123, 789, teststring2
  • 第二行的Teststring2,感谢发现我更正了它
  • 数组中的对象中item3/item4键的顺序会一直一样吗?
  • @peak 是的,顺序总是一样的

标签: json export-to-csv jq


【解决方案1】:

不需要使用 shell 的 printf()xargs 处理输出,因为您可以完全在 jq 本身中进行处理。

您需要每次迭代.item3.item4 的值以获得.item2 的唯一值。要获得正确的 CSV 格式的结果,请使用 @csv 格式化数组,对于表格表示,您可以使用 @tsv

jq -r '.[].item1 as $data | $data.array1[] | [ $data.item2 , .item3 , .item4 ] | @csv' json

此外,在预期输出中丢失 .item4 值周围的引号也没有意义,因为它们应该保留在有效的 JSON 字符串属性中。

如果您仍然需要松开引号并将它们表示为原始字符串,您可以在形成的数组上使用join

jq -r '.[].item1 as $data | $data.array1[] | [ ($data.item2|tostring) , (.item3|tostring) , .item4 ]|join(", ")'

【讨论】:

    【解决方案2】:

    这会有所帮助

    https://jqplay.org/s/KLPXwB7Ey_

    .[].item1 as $item | $item.array1[] | $item.item2 , .item3 , .item4
    

    【讨论】:

    • 不太完整。 OP 需要 CSV 格式的结果
    猜你喜欢
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    • 2023-02-15
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    相关资源
    最近更新 更多