Добавить несколько фиктивных объектов в массив json с помощью jq - PullRequest
1 голос
/ 18 февраля 2020

Допустим, это мой массив:

[
  {
    "name": "Matias",
    "age": "33"
  }
]

Я могу сделать это:

echo "$response" | jq '[ .[] | select(.name | test("M.*"))] | . += [.[]]'

И он выдаст:

[
  {
    "name": "Matias",
    "age": "33"
  },
  {
    "name": "Matias",
    "age": "33"
  }
]

Но я не могу сделать это:

echo "$response" | jq '[ .[] | select(.name | test("M.*"))] | . += [.[] * 3]'
jq: error (at <stdin>:7): object ({"name":"Ma...) and number (3) cannot be multiplied

Мне нужно расширить массив, чтобы создать фиктивный массив с 100 значениями. И я не могу это сделать. Кроме того, я хотел бы иметь случайный возраст на объектах. (Поэтому позже я могу отфильтровать файл для измерения производительности приложения.

1 Ответ

1 голос
/ 19 февраля 2020

В настоящее время jq не имеет встроенной функции рандомизации, но достаточно просто генерировать случайные числа, которые может использовать jq. Следующее решение использует awk, но таким образом, что некоторые другие PRNG могут быть легко использованы.

#!/bin/bash

function template {
    cat<<EOF
[
  {
    "name": "Matias",
    "age": "33"
  }
]

EOF
}

function randoms {
    awk -v n=$1 'BEGIN { for(i=0;i<n;i++) {print int(100*rand())} }'
}

randoms 100 | jq -n --argfile template <(template) '
  first($template[] | select(.name | test("M.*"))) as $t
  | [ $t | .age = inputs]
'

Замечание по производительности

Даже несмотря на то, что вышеупомянутые используют awk и jq вместе, эта комбинация примерно в 10 раз быстрее, чем опубликованное решение jtc с использованием -eu:

jq+awk: u+s = 0.012s

jtc with -eu: u+s = 0.192s

Использование jt c в сочетании с awk, как указано выше, однако дает u + s == 0,008 с на той же машине.

...