Содержать результаты фильтра .jq в одном массиве - PullRequest
1 голос
/ 30 мая 2020

В следующем примере ввода:

{"contacts":{"orgid":"1","email":"janedoe@aol.com","first_name":"Jane","last_name":"Doe","phone":"4045551212","tags":["tag1","tag2"],"fields":[{"id":"2","value":"IB4220"},{"id":"3","value":"1994-05-18"},{"id":"12","value":"CONSULTANT"},{"id":"13","value":"janedoe@aol.com"},{"id":"6","value":"111 Main Blvd"},{"id":"7","value":"Babylon"},{"id":"8","value":"NY"},{"id":"9","value":"11702-1522"},{"id":"10","value":"US"},{"id":"11","value":""},{"id":"5","value":"http://www.something.com/janedoe"}]}}
{"contacts":{"orgid":"1","email":"janedoe@aol.com","first_name":"Jane","last_name":"Doe","phone":"4045551212","tags":["tag1","tag2"],"fields":[{"id":"2","value":"IB4220"},{"id":"3","value":"1994-05-18"},{"id":"12","value":"CONSULTANT"},{"id":"13","value":"janedoe@aol.com"},{"id":"6","value":"111 Main Blvd"},{"id":"7","value":"Babylon"},{"id":"8","value":"NY"},{"id":"9","value":"11702-1522"},{"id":"10","value":"US"},{"id":"11","value":""},{"id":"5","value":"http://www.something.com/janedoe"}]}}

Я пытаюсь поместить результат моего фильтра в один массив «контактов».

Вот мой фильтр jq, с которым я работаю. безрезультатно ...

jq --slurp '.[] | .[].fields[].id |= tonumber | .[].orgid |= tonumber | {contacts: [.[]| {orgid: .["orgid"],email: .["email"],first_name: .["first_name"],last_name: .["last_name"],phone: .["phone"],tags:[ .["tags"]],fields}]}'

Он оборачивает каждую строку ввода в массив «контактов», как показано ниже ...

{
  "contacts": [
    {
      "orgid": 1,
      "email": "janedoe@aol.com",
      "first_name": "Jane",
      "last_name": "Doe",
      "phone": "4045551212",
      "tags": [
        [
          "tag1",
          "tag2"
        ]
      ],
      "fields": [
        {
          "id": 2,
          "value": "IB4220"
        },
        {
          "id": 3,
          "value": "1994-05-18"
        },
        {
          "id": 12,
          "value": "CONSULTANT"
        },
        {
          "id": 13,
          "value": "janedoe@aol.com"
        },
        {
          "id": 6,
          "value": "111 Main Blvd"
        },
        {
          "id": 7,
          "value": "Babylon"
        },
        {
          "id": 8,
          "value": "NY"
        },
        {
          "id": 9,
          "value": "11702-1522"
        },
        {
          "id": 10,
          "value": "US"
        },
        {
          "id": 11,
          "value": ""
        },
        {
          "id": 5,
          "value": "http://www.something.com/janedoe"
        }
      ]
    }
  ]
}
{
  "contacts": [
    {
      "orgid": 1,
      "email": "janedoe@aol.com",
      "first_name": "Jane",
      "last_name": "Doe",
      "phone": "4045551212",
      "tags": [
        [
          "tag1",
          "tag2"
        ]
      ],
      "fields": [
        {
          "id": 2,
          "value": "IB4220"
        },
        {
          "id": 3,
          "value": "1994-05-18"
        },
        {
          "id": 12,
          "value": "CONSULTANT"
        },
        {
          "id": 13,
          "value": "janedoe@aol.com"
        },
        {
          "id": 6,
          "value": "111 Main Blvd"
        },
        {
          "id": 7,
          "value": "Babylon"
        },
        {
          "id": 8,
          "value": "NY"
        },
        {
          "id": 9,
          "value": "11702-1522"
        },
        {
          "id": 10,
          "value": "US"
        },
        {
          "id": 11,
          "value": ""
        },
        {
          "id": 5,
          "value": "http://www.something.com/janedoe"
        }
      ]
    }
  ]
}

... Но мне это нужно вот так (1 массив "contacts", содержащий все отфильтрованные входные строки) ...

{
    "contacts": [
        {
            "orgid": "1",
            "email": "janedoe@aol.com",
            "first_name": "Jane",
            "last_name": "Doe",
            "phone": "4045551212",
            "tags": [
                "tag1",
                "tag2"
            ],
            "fields": [
                {
                    "id": "2",
                    "value": "IB4220"
                },
                {
                    "id": "3",
                    "value": "1994-05-18"
                },
                {
                    "id": "12",
                    "value": "CONSULTANT"
                },
                {
                    "id": "13",
                    "value": "janedoe@aol.com"
                },
                {
                    "id": "6",
                    "value": "111 Main Blvd"
                },
                {
                    "id": "7",
                    "value": "Babylon"
                },
                {
                    "id": "8",
                    "value": "NY"
                },
                {
                    "id": "9",
                    "value": "11702-1522"
                },
                {
                    "id": "10",
                    "value": "US"
                },
                {
                    "id": "11",
                    "value": ""
                },
                {
                    "id": "5",
                    "value": "http://www.something.com/janedoe"
                }
            ]
        },
        {
            "orgid": "1",
            "email": "janedoe@aol.com",
            "first_name": "Jane",
            "last_name": "Doe",
            "phone": "4045551212",
            "tags": [
                "tag1",
                "tag2"
            ],
            "fields": [
                {
                    "id": "2",
                    "value": "IB4220"
                },
                {
                    "id": "3",
                    "value": "1994-05-18"
                },
                {
                    "id": "12",
                    "value": "CONSULTANT"
                },
                {
                    "id": "13",
                    "value": "janedoe@aol.com"
                },
                {
                    "id": "6",
                    "value": "111 Main Blvd"
                },
                {
                    "id": "7",
                    "value": "Babylon"
                },
                {
                    "id": "8",
                    "value": "NY"
                },
                {
                    "id": "9",
                    "value": "11702-1522"
                },
                {
                    "id": "10",
                    "value": "US"
                },
                {
                    "id": "11",
                    "value": ""
                },
                {
                    "id": "5",
                    "value": "http://www.something.com/janedoe"
                }
            ]
        }
    ]
}

1 Ответ

2 голосов
/ 30 мая 2020

Чтобы получить «ожидаемый» результат, как показано, вы можете использовать следующий фильтр jq в сочетании с параметром -s:

{ contacts: [.[] | [.contacts]] | add }

Однако ваша программа jq указывает, что вы также хотите преобразовать некоторые строки к числам. Это делается в соответствии с предложенными вами строками и, таким образом, остается в качестве упражнения, но полное решение с использованием альтернативного подхода показано ниже. используйте -n с inputs:

[ [inputs.contacts 
   | .fields[].id |= tonumber
   | .orgid |= tonumber] ]
| {contacts: add}

...