编写 jq 以在 json 列表上添加键名称

编写 jq 以在 json 列表上添加键名称

我试图在 Linux 中编写一个查询来替换 json 文件并将其写入新文件中。

我的 json 文件的格式如下:

{"intents": [
  {
    "patterns": "'For the last 8 years of his life, Galileo was under house arrest for espousing this man's theory'",
    "responses": "Copernicus"
  },
  {
    "patterns": "'No. 2: 1912 Olympian; football star at Carlisle Indian School; 6 MLB seasons with the Reds, Giants & Braves'",
    "responses": "Jim Thorpe"
  },

对于像上面这样的大约 200k 条目。

我执行的命令如下:

jq --argjson r \
  "$( jo tag = "$(curl -Ss "https://www.random.org/integers/?num=1&min=0&max=1000000&col=1&base=10&format=plain&rnd=new")")" \
  '.intents[] += $r' \
< intents7.json > intents_super.json

我想添加一个新的键名在列表中作为标签名字和我想填写密钥(标签)对于每个带有随机数。该命令已执行,但到目前为止我已经等待了 30 分钟,文件intents_super.json 中没有任何输出。

笔记:cpu 也在终端中保持 100% 不变,我得到了这两行,但命令仍在运行......:

Argument `tag' is neither k=v nor k@v
Argument `17208' is neither k=v nor k@v

该命令是否执行我想要的操作?

答案1

假设您想tag向顶级intents数组的每个元素添加一个新键 ,并以随机数作为值,那么您可以这样做:

some-command | jq -n 'input | .intents |= map(.tag = input)' intents7.json -

... 其中some-command是生成无限随机数流的命令,每行一个(例如,shuf -i 0-100 -rjot -r 0或类似)。

jq命令与其选项一起使用-n来关闭输入的正常读取。相反,input用于获取下一个对象。

第一个对象是从文件中读取的intents7.json,它包含intents我们要修改的数组。我们使用 来修改数组的每个元素map()。我们map在每个元素上添加的表达式添加一个tag键以及使用 读取的值input。每次调用input(在第一次调用之后)都会从 的标准输入流读取jq。在该流上,有可用的随机数,这些随机数用于新tag密钥的值。

运行示例(使用问题中数据的更正变体):

$ shuf -i 0-1000 -r | jq -n 'input | .intents |= map(.tag = input)' intents7.json -
{
  "intents": [
    {
      "patterns": "'For the last 8 years of his life, Galileo was under house arrest for espousing this man's theory'",
      "responses": "Copernicus",
      "tag": 517
    },
    {
      "patterns": "'No. 2: 1912 Olympian; football star at Carlisle Indian School; 6 MLB seasons with the Reds, Giants & Braves'",
      "responses": "Jim Thorpe",
      "tag": 955
    }
  ]
}

答案2

我通过另一种方式解决了我的问题:

od -t x -An /dev/random | tr -d " " | fold -w 8 | jq -nRc --slurpfile stream intents7.json '$stream[] .intents[] | .tag=input' > intensfinalllllll.json

相关内容