我试图在 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 -r
或jot -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