简体   繁体   中英

Append multiple dummy objects to json array with jq

Lets say this is my array :

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

I can do this :

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

And it will output :

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

But I cant do this :

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

I need to extend an array to create a dummy array with 100 values. And I cant do it. Also, I would like to have a random age on the objects. ( So later on I can filter the file to measure performance of an app .

Currently jq does not have a built-in randomization function, but it's easy enough to generate random numbers that jq can use. The following solution uses awk but in a way that some other PRNG can easily be used.

#!/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]
'

Note on performance

Even though the above uses awk and jq together, this combination is about 10 times faster than the posted jtc solution using -eu :

jq+awk: u+s = 0.012s

jtc with -eu: u+s = 0.192s

Using jtc in conjunction with awk as above, however, gives u+s == 0.008s on the same machine.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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