【问题标题】:Join array and dictionary into TSV in jq将数组和字典加入 jq 中的 TSV
【发布时间】:2021-06-14 03:38:40
【问题描述】:

我在底部有输入的 JSON 数据。

我想生成如下所示的 TSV 输出。 <TAB> 是制表符。谁能告诉我如何在 jq 中做到这一点?

timestamp<TAB>open<TAB>high<TAB>dividends
1623072600<TAB>4229.33984375<TAB>4232.33984375<TAB>
1623159000<TAB>4233.81005859375<TAB>4236.740234375<TAB>
1623245400<TAB>4232.990234375<TAB>4237.08984375<TAB>0.42
1623331800<TAB>4228.56005859375<TAB>4249.740234375<TAB>
1623418200<TAB>4242.89990234375<TAB>4248.3798828125<TAB>
{
  "timestamp": [
    1623072600,
    1623159000,
    1623245400,
    1623331800,
    1623418200
  ],
  "indicators": {
    "quote": [
      {
        "open": [
          4229.33984375,
          4233.81005859375,
          4232.990234375,
          4228.56005859375,
          4242.89990234375
        ],
        "high": [
          4232.33984375,
          4236.740234375,
          4237.08984375,
          4249.740234375,
          4248.3798828125
        ]
      }
    ]
  },
  "events": {
    "dividends": {
      "1623245400": {
        "amount": 0.42,
        "date": 1623245400
      }
    }
  }
}

【问题讨论】:

  • 因为我没有对这个问题投反对票,所以我不能说为什么会发生这种情况,但由于 Q 实际上很有趣,我想指出不包括尝试解决方案的问题经常被投反对票.

标签: json jq export-to-tsv


【解决方案1】:

将 jq 与 -r 命令行选项一起使用:

(.events.dividends|map_values(.amount)) as $dividends
| ["timestamp", "open", "high", "dividends"],
  ( [.timestamp, (.indicators.quote[0] | .open, .high),
     [$dividends[.timestamp[]|tostring]]]
    | transpose[])
| @tsv

注意如何使用提供的 $dividends 字典计算股息列:

$dividends[.timestamp[]|tostring]

【讨论】:

  • 如果在某些输入中,dividends 不存在怎么办?如何使 jq 代码对此类情况具有鲁棒性?
  • 您确实应该避免在 originsl 问题得到回答和投票后提出新问题。此外,您基本上已经在 stackoverflow.com/questions/67949284/… 上的一个 SO qustions 中提出了这个新问题,该问题已经得到解答。
  • 前一个不相关。我试过.events.dividends?。但它最终会少一列。我希望最后一列全部为空,而不是完全丢失。
  • 答案是相关的。如果您无法弄清楚,也许您应该接受这个答案,并提出一个新的 SO 问题。
猜你喜欢
  • 2019-01-26
  • 1970-01-01
  • 1970-01-01
  • 2021-05-13
  • 2019-04-13
  • 2019-12-10
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
相关资源
最近更新 更多