Linux

編寫 jq 在 json 列表中添加鍵名

  • June 22, 2022

我試圖在 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 -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
   }
 ]
}

引用自:https://unix.stackexchange.com/questions/707085