簡體   English   中英

jq-基於json中的鍵值對進行解析和替換

[英]jq - parsing& replacement based on key-value pairs within json

我有一個鍵-值映射形式的json文件。 例如:

{
    "users":[
    {
        "key1":"user1",
        "key2":"user2"
    }
  ]
}

我還有另一個json文件。 必須根據第一個文件中的鍵替換第二個文件中的值。

例如,第二個文件是:

{
    "info":
    {
    "users":["key1","key2","key3","key4"]
    }
}

第二個文件應替換為

{
    "info":
    {
    "users":["user1","user2","key3","key4"]
    }
}

因為第一個文件中的key1的值為user1。 這可以用任何python程序完成,但是我正在學習jq,並想嘗試一下jq本身是否可行。 我嘗試了使用slurpfile讀取文件的不同組合,然后選擇&walk等。但是無法達到所需的解決方案。

任何建議相同的將不勝感激。

jq解決方案:

jq --slurpfile users 1st.json '$users[0].users[0] as $users 
     | .info.users |= map(if in($users) then $users[.] else . end)' 2nd.json

輸出:

{
  "info": {
    "users": [
      "user1",
      "user2",
      "key3",
      "key4"
    ]
  }
}

由於.users [0]是JSON字典,因此按原樣使用它(例如,為了提高效率)將是有意義的:

調用:jq -c --slurpfile users users.json -f program.jq input.json

program.jq:

$users[0].users[0] as $dict
| .info.users |= map($dict[.] // .)

輸出:

{"info":{"users":["user1","user2","key3","key4"]}}

注意:以上假設字典中不包含任何null或false值,或者應忽略字典中的任何此類值。 這避免了原本需要的雙重查找。 如果該假設無效,則使用hasin的解決方案(例如,由RomanPerekhrest提供)將是適當的。

解決補充問題

(看評論”。)

$users[0].users[0] as $dict
| second
| .info.users |= (map($dict[.] | select(. != null)))

海綿

強烈建議不要使用重定向來覆蓋輸入文件。 如果您有或可以安裝sponge ,那么使用它會更好。 有關更多詳細信息,請參見例如“ jq等同於sed -i?” 在jq FAQ中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM