首页 > 解决方案 > JQ - 在数组打印后获取另一个更高级别的键值

问题描述

我有这个 JSON 数据:

price_history.json

{
  "candles": [
    {
      "open": 26,
      "high": 26.25,
      "low": 25.75,
      "close": 26.0625,
      "volume": 1038600,
      "datetime": 957762000000
    },
    {
      "open": 25.8125,
      "high": 26.25,
      "low": 25.75,
      "close": 26,
      "volume": 765900,
      "datetime": 957848400000
    }
  ],
  "symbol": "ABC",
  "empty": false
}

我需要将其转换为 CSV。我可以使用以下过滤器获得几乎所有我需要的东西,但我想添加数组外部的符号:

cat price_history.json | jq '.candles[] | (.open|tostring) + "," + (.high|tostring)  + "," + (.low|tostring)  + "," + (.close|tostring)  + "," + (.volume|tostring)  + "," + (.datetime|tostring)' 

回复:

"26,26.25,25.75,26.0625,1038600,957762000000"
"25.8125,26.25,25.75,26,765900,957848400000"

期望的回应:

"26,26.25,25.75,26.0625,1038600,957762000000,ABC"
"25.8125,26.25,25.75,26,765900,957848400000,ABC"

我尝试了许多组合,试图回到顶层拾取符号,包括尝试先拾取它。我不在乎它排在哪里

这是我得到的最接近的,除了打印密钥和我不需要的所有东西外,它什么都有:

cat /home/utility/scripts/marketScan/app/modules/api-comm/tdam/port/input/price_history-2.txt | jq '(.candles[]|tostring) + "," + (.symbol|tostring)'

回复

"{\"open\":26,\"high\":26.25,\"low\":25.75,\"close\":26.0625,\"volume\":1038600,\"datetime\":957762000000},ABC"
""{\"open\":25.8125,\"high\":26.25,\"low\":25.75,\"close\":26,\"volume\":765900,\"datetime\":957848400000},ABC"

标签: jsonexport-to-csvjq

解决方案


如果您真的想要有效的 CSV,通常最好@csv与 -r 命令行选项结合使用。在您的情况下,您可以选择:

.symbol as $symbol
| .candles[]
| [.open, .high, .low, .close, .volume, .datetime, $symbol]
| @csv

或等效但没有 $-变量:

(.candles[] | [.open, .high, .low, .close, .volume, .datetime]) + [.symbol]
| @csv

如果您愿意承担风险,您还可以考虑:

.symbol as $symbol
| .candles[]
| [.[], $symbol]
| @csv

推荐阅读