繁体   English   中英

仅使用选定的键将 json 转换为 csv

[英]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

以下变体假设“白名单”方法是合适的:

无 header 行

.prefixes[] | [.ip_prefix,.region,.service] | @csv

或者,将白名单指定为参数:

jq -r --argjson whitelist '["ip_prefix","region","service"]' '
  .prefixes[] | [ .[$whitelist[]] ] | @csv'

使用 header 行:

["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.

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