Linux
編寫 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%,我得到了這 2 行,但命令仍在執行..:
Argument `tag' is neither k=v nor k@v Argument `17208' is neither k=v nor k@v
該命令是否執行我想要的操作?
假設您要向
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 } ] }