如何使用 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
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
要格式化毫秒列,请将其转换为秒(除以 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
我正在尝试使用 'jq'
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
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
要格式化毫秒列,请将其转换为秒(除以 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