代码之家  ›  专栏  ›  技术社区  ›  bluethundr

使用jq向csv数组添加布尔值

  •  2
  • bluethundr  · 技术社区  · 6 年前

    我需要得到一个亚马逊图像的列表,我需要显示的值之一是一个布尔值(真/假)。

    例如,我可以从需要处理的列表中提取图像ID,而不会出现问题:

    cat oneimage.json | jq -r '.Images[] | [.ImageId] | @csv'
    "ami-000bd263d51e443f2"
    

    但我需要添加到列表中的下一个值是一个真/假值,jq将在下一个命令处阻塞:

    cat oneimage.json | jq -r '.Images[] | [.ImageId, ([.BlockDeviceMappings[].Ebs.DeleteOnTermination] | join(","))] | @csv'
    jq: error (at <stdin>:89): string ("") and boolean (true) cannot be added
    

    JSON包含一个卷列表。“deleteontermation”值对于列表中的每个卷都是唯一的,并且必须以csv格式进入同一个“cell”。

    目标是将csv输出到电子表格中,并在每个图像的单元格中的一行上用逗号分隔所有的deleteontermination值。

    下面是我用于此测试的JSON:

    {
    "Images": [{
        "VirtualizationType": "hvm",
        "Description": "AB-P-RIDD-TRAN05-12-13-2018",
        "Hypervisor": "xen",
        "ImageId": "ami-000bd263d51e443f2",
        "State": "available",
        "BlockDeviceMappings": [{
                "DeviceName": "/dev/sda1",
                "Ebs": {
                    "SnapshotId": "snap-0f1076dce3103833f",
                    "DeleteOnTermination": true,
                    "VolumeType": "gp2",
                    "VolumeSize": 100,
                    "Encrypted": false
                }
            },
            {
                "DeviceName": "/dev/sdi",
                "Ebs": {
                    "SnapshotId": "snap-0c7d71a9d3887a048",
                    "DeleteOnTermination": true,
                    "VolumeType": "gp2",
                    "VolumeSize": 5,
                    "Encrypted": false
                }
            },
            {
                "DeviceName": "/dev/sdg",
                "Ebs": {
                    "SnapshotId": "snap-00402196b9e023a72",
                    "DeleteOnTermination": true,
                    "VolumeType": "gp2",
                    "VolumeSize": 10,
                    "Encrypted": false
                }
            },
            {
                "DeviceName": "/dev/sdk",
                "Ebs": {
                    "SnapshotId": "snap-05f65a62735de2846",
                    "DeleteOnTermination": true,
                    "VolumeType": "gp2",
                    "VolumeSize": 20,
                    "Encrypted": false
                }
            },
            {
                "DeviceName": "/dev/sdj",
                "Ebs": {
                    "SnapshotId": "snap-0d350170b9d5c62bb",
                    "DeleteOnTermination": true,
                    "VolumeType": "gp2",
                    "VolumeSize": 40,
                    "Encrypted": false
                }
            },
            {
                "DeviceName": "/dev/sdh",
                "Ebs": {
                    "SnapshotId": "snap-04679d09d89609e79",
                    "DeleteOnTermination": true,
                    "VolumeType": "gp2",
                    "VolumeSize": 30,
                    "Encrypted": false
                }
            },
            {
                "DeviceName": "/dev/sdf",
                "Ebs": {
                    "SnapshotId": "snap-0b5f861fd93da6b20",
                    "DeleteOnTermination": true,
                    "VolumeType": "gp2",
                    "VolumeSize": 5,
                    "Encrypted": false
                }
            }
        ],
        "Architecture": "x86_64",
        "ImageLocation": "123456789191/AB-P-RIDD-TRAN05-12-13-2018",
        "RootDeviceType": "ebs",
        "OwnerId": "123456789191",
        "RootDeviceName": "/dev/sda1",
        "CreationDate": "2018-12-14T01:39:31.000Z",
        "Public": false,
        "ImageType": "machine",
        "Name": "AB-P-RIDD-TRAN05-12-13-2018"
    }]
    

    }

    如何使deleteontermination值显示在一个csv单元格中,用逗号分隔,每个卷有一个deleteontermination值?

    2 回复  |  直到 6 年前
        1
  •  2
  •   oguz ismail FCulig    6 年前

    你需要使用 tostring .

    .bool_value | tostring
    

    在您的案例中的用法:

    jq -r '.Images[] | [.ImageId, ( [.BlockDeviceMappings[].Ebs.DeleteOnTermination | tostring] | join(",") )] | @csv' file
    

    产量:

    "ami-000bd263d51e443f2","true,true,true,true,true,true,true"
    
        2
  •  0
  •   peak    6 年前

    这是一个定义 join 它可以与JQ的所有现有版本(即JQ 1.3及以上版本)一起使用,并提供JQ 1.6的灵活语义(即,它只要求数组中的所有项都是标量):

    def join(c):
      if length==0 then ""
      else reduce .[1:][] as $x (.[0]|tostring; . + c + ($x|tostring))
      end;
    

    为了便于参考:

    • tostring 在JQ的所有现存版本中都可用;

    • JQ 1.3没有 join/1 (但它确实有 @csv )