如何使用 jq 连接 JSON 数组中的两个字段

How to join two fields in JSON array with jq

我正在尝试使用 'jq'

在一行中获取数组中 2 个字段的输出
curl -X 'GET' "https://api.coingecko.com/api/v3/coins/ethereum/market_chart?vs_currency=USD&days=10&interval=daily" -H 'accept: application/json'|jq '.prices[][]

给我这样的输出:

1652227200000
2344.797715643986
1652313600000
2080.910243657776
1652400000000
1966.6991711336661
1652486400000
2010.214051125259
1652572800000
2064.229357512243
1652659200000
2147.047447880575
1652745600000
2025.8886983912162
1652832000000
2095.178884796724
1652918400000
1915.1771232664505
1653004800000
2023.8482593608173
1653070323000
1931.3963167096579

并且我希望输出的日期价格(在一行中)带有 space 或介于两者之间的制表符

1653004800000    2023.8482593608173
1653070323000    1931.3963167096579

我试过 '.price[][]|join(" ")' 但没用。 也可能将价格格式化为有 2 位小数。如果我只输出如下价格,我就能做到:

...|jq .price[][1]| xargs printf "%'.2f\n"

如果我有 2 个值,我不确定该怎么做。

第二个 [] 将带您找到要对齐的元素。省略它(但保留第一个,因为您想要访问 .prices 数组的元素),并格式化该数组。例如,您可以使用 @tsv 获得项目 tab-separated。或者,您可以使用带分隔符字符串的 join 函数。

curl … | jq -r '.prices[] | @tsv'
1652227200000   2344.797715643986
1652313600000   2080.910243657776
1652400000000   1966.6991711336661
1652486400000   2010.214051125259
1652572800000   2064.229357512243
1652659200000   2147.047447880575
1652745600000   2025.8886983912162
1652832000000   2095.178884796724
1652918400000   1915.1771232664505
1653004800000   2023.8482593608173
1653073654000   1942.3670724677067

Demo

curl … | jq -r '.prices[] | join(" | ")'
1652227200000 | 2344.797715643986
1652313600000 | 2080.910243657776
1652400000000 | 1966.6991711336661
1652486400000 | 2010.214051125259
1652572800000 | 2064.229357512243
1652659200000 | 2147.047447880575
1652745600000 | 2025.8886983912162
1652832000000 | 2095.178884796724
1652918400000 | 1915.1771232664505
1653004800000 | 2023.8482593608173
1653073654000 | 1942.3670724677067

Demo


要格式化毫秒列,请将其转换为秒(除以 1000),然后使用带有格式字符串的 strftime(或本地时间的 strflocaltime)。要将价格列四舍五入到两位小数,请将其乘以 100,使用 round 再除。

curl … | jq -r '.prices[]
  | .[0] |= (./1000 | strftime("%d-%m-%Y"))
  | .[1] |= (. * 100 | round / 100)
  | @tsv
'
11-05-2022  2344.8
12-05-2022  2080.91
13-05-2022  1966.7
14-05-2022  2010.21
15-05-2022  2064.23
16-05-2022  2147.05
17-05-2022  2025.89
18-05-2022  2095.18
19-05-2022  1915.18
20-05-2022  2023.85
20-05-2022  1942.37

Demo