Добавьте логическое значение в массив csv с помощью jq - PullRequest
0 голосов
/ 15 декабря 2018

Мне нужно получить список изображений амазонки, и одно из значений, которые мне нужно показать, - это логическое значение (true / false).

Например, я могу извлечь идентификаторы изображений из списка, который мне нужно обработать без проблем:

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

Но следующее значение, которое мне нужно добавить в список, это значение true / falseи 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 содержит список томов.Значение «DeleteOnTermination» будет уникальным для каждого тома в списке и должно входить в одну и ту же «ячейку» в формате csv.

Цель состоит в том, чтобы вывести csv в электронную таблицу и иметь все значения DeleteOnTermination, разделенные запятой в одной строке в ячейке для каждого изображения.

Вот json I'mиспользуя для этого теста:

{
"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 ]

0 голосов
/ 15 декабря 2018

Вот определение 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).

0 голосов
/ 15 декабря 2018

Вам необходимо использовать tostring.

.bool_value | tostring

Использование в вашем случае:

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

Выход:

"ami-000bd263d51e443f2","true,true,true,true,true,true,true"
...