繁体   English   中英

jq 1.5:将一个数组中的键与它们在不同数组中的值组合在一起

[英]jq 1.5: Combining keys from one array with their values that are in a different array

我想获取一个数组中的一些键值,并将它们与不同数组中的相应值进行匹配。 作为参考,我使用的是jq-1.5

我从quandl api获得了一些数据,我正在提取一些股票数据。 例如,以下内容会删除一些json数据。

curl https://www.quandl.com/api/v3/datatables/WIKI/PRICES.json?ticker=FB&qopts.columns=date,close,high,low&api_key=myapikeyblahblah

数据如下,虽然我删除了一些冗余数据;

{
  "datatable": {
    "data": [
      ["2012-05-18", 38.2318, 45.0, 38.0],
      ["2012-05-21", 34.03, 36.66, 33.0],
      ["2012-05-22", 31.0, 33.59, 30.94],
      ["2017-06-22", 153.4, 154.55, 152.91],
      ["2017-06-23", 155.07, 155.2, 152.65]
    ],
    "columns": [{
      "name": "date",
      "type": "Date"
    }, {
      "name": "close",
      "type": "BigDecimal(34,12)"
    }, {
      "name": "high",
      "type": "BigDecimal(34,12)"
    }, {
      "name": "low",
      "type": "BigDecimal(34,12)"
    }]
  },
  "meta": {
    "next_cursor_id": null
  }
}

我希望将.datatable.columns [$ index1] .name中的“键”与.datatable.data [1]中的“values”匹配,依此类推每个迭代索引值。 我希望获得如下输出;

[
  {
    "date": "2012-05-18",
    "close": 38.2318,
    "high": 45.0,
    "low": 38.0
  },
  {
    "date": "2012-05-21",
    "close": 34.03,
    "high": 36.66,
    "low": 33.0
  },
  {
    "date": "2012-05-22",
    "close": 31.0,
    "high": 33.59,
    "low": 30.94
  },
  {
    "date": "2017-06-22",
    "close": 153.4,
    "high": 154.55,
    "low": 152.91
  },
  {
    "date": "2017-06-23",
    "close": 155.07,
    "high": 155.2,
    "low": 152.65
  }
]

到目前为止,我已经玩弄了计算索引的想法,但到目前为止,我的大部分解决方案都相当冗长,而且我发现自己走出jq到sed / awk等等我想象的很容易在jq。

这是一个帮助函数,使解决方案易于理解。 它将输入数组转换为一个对象,假设headers是一个字符串数组,用作键名:

def objectify(headers):
  [headers, .] | transpose | map( { (.[0]): .[1] } ) | add;

解决方案现在很简单:

.datatable
| (.columns | map(.name)) as $headers
| .data
| map( objectify($headers) )

Python解决方案:

combine_keys.py脚本:

import sys, json

data = json.load(open(sys.argv[1], 'r'))
columns = [o['name'] for o in data['datatable']['columns']]
result = json.dumps([dict(zip(columns, i)) for i in data['datatable']['data']], indent=4)
print(result)

用法

python combine_keys.py input.json

输出:

[
    {
        "low": 38.0,
        "date": "2012-05-18",
        "close": 38.2318,
        "high": 45.0
    },
    {
        "low": 33.0,
        "date": "2012-05-21",
        "close": 34.03,
        "high": 36.66
    },
    {
        "low": 30.94,
        "date": "2012-05-22",
        "close": 31.0,
        "high": 33.59
    },
    {
        "low": 152.91,
        "date": "2017-06-22",
        "close": 153.4,
        "high": 154.55
    },
    {
        "low": 152.65,
        "date": "2017-06-23",
        "close": 155.07,
        "high": 155.2
    }
]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM