[英]Convert json to csv with only selected keys
我有一个包含以下内容的 json 脚本。
{
"syncToken": "1612442658",
"createDate": "2021-02-04-12-44-18",
"prefixes": [
{
"ip_prefix": "3.5.140.0/22",
"region": "ap-northeast-2",
"service": "AMAZON",
"network_border_group": "ap-northeast-2"
},
{
"ip_prefix": "35.180.0.0/16",
"region": "eu-west-3",
"service": "AMAZON",
"network_border_group": "eu-west-3"
},
{
"ip_prefix": "52.93.178.234/32",
"region": "us-west-1",
"service": "AMAZON",
"network_border_group": "us-west-1"
}
]
}
我的要求是将此 json 转换为 csv 格式如下。
ip_prefix region service
3.5.140.0/22 ap-northeast-2 AMAZON
35.180.0.0/16 eu-west-3 AMAZON
52.93.178.234/32 us-west-1 AMAZON
使用 jq 使用以下命令转换数据
jq -r '(.prefixes[0] | keys_unsorted), (.prefixes[] | to_entries | map(.value))|@tsv' ip-ranges.json
但它导出所有密钥。 在导出许多键中的少数键时需要帮助。
假设您在$fields
中有一个字段列表。 那么你所需要的就是:
.prefixes | // The array of records from which we will build our rows.
(
$fields, // The header row
( // The data rows
.[] | // For each input,
[ .[ $fields[] ] ] // create an array of the selected values
)
) |
@tsv
这将作为以下所有解决方案的基础。 不同的是我们如何构建$fields
。
允许列表:
[ "ip_prefix", "region", "service" ] as $fields |
.prefixes |
( $fields, ( .[] | [ .[ $fields[] ] ] ) ) | @tsv
示例使用:
jq -r --argjson fields '[ "ip_prefix", "region", "service" ]' '
[ "ip_prefix", "region", "service" ] as $fields |
.prefixes |
( $fields, ( .[] | [ .[ $fields[] ] ] ) ) | @tsv
' data.json
被阻止的项目:
.prefixes |
( .[0] | keys_unsorted | map(select( . != "network_border_group" )) ) as $fields |
.prefixes |
( $fields, ( .[] | [ .[ $fields[] ] ] ) ) | @tsv
黑名单:
[ "network_border_group" ] as $blocked |
.prefixes |
( .[0] | keys_unsorted - $blocked ) as $fields |
( $fields, ( .[] | [ .[ $fields[] ] ] ) ) | @tsv
示例使用:
jq -r --argjson blocked '[ "network_border_group" ]' '
.prefixes |
( .[0] | keys_unsorted - $blocked ) as $fields |
( $fields, ( .[] | [ .[ $fields[] ] ] ) ) | @tsv
' data.json
以下变体假设“白名单”方法是合适的:
.prefixes[] | [.ip_prefix,.region,.service] | @csv
或者,将白名单指定为参数:
jq -r --argjson whitelist '["ip_prefix","region","service"]' '
.prefixes[] | [ .[$whitelist[]] ] | @csv'
["ip_prefix","region","service"] as $whitelist
| $whitelist,
(.prefixes[] | [getpath($whitelist[]|[.])])
| @csv
等等。
请注意,以上都不需要对源中的对象中的键进行任何特殊排序。
一种方法是使用更新运算符|=
删除不需要的键值对。
jq -r '.prefixes[] |= del(.network_border_group)
| (.prefixes[0] | keys_unsorted),
(.prefixes[] | to_entries | map(.value))
| @tsv'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.