我是新來的。并嘗試根據內容將 JSON 拆分或拆分為多個檔案。目標組的“名稱”是“root_rgs”,我希望每個檔案都放在不同的檔案中。
{
"root_rgs": [
"PROM_FD_ARCNA",
"PROM_JOB_ICMP"
],
"targets": [
"HCC02155",
"HCC09350",
"HCC09321",
"HCCEFACTORYWWW",
"HCC9723"
]
}
{
"root_rgs": [
"PROM_FD_ARCNA",
"PROM_JOB_WIN"
],
"targets": [
"LABTNSARWID236",
"LABTNSARWID692",
"VM00006"
]
}
{
"root_rgs": [
"PROM_FD_MTZ",
"PROM_JOB_ICMP"
],
"targets": [
"TEIARWIN205",
"TEIARWDB150",
"TEIARWCXWA212"
]
}
是否有可能產生類似的東西:
ARCNA_ICMP.json
{
TARGETS:
"HCC02155",
"HCC09350",
"HCC09321",
"HCCEFACTORYWWW",
"HCC9723"
}
ARCNA_WIN.json
{
TARGETS:
"LABTNSARWID236",
"LABTNSARWID692",
"VM00006"
}
等等...
希望說清楚,謝謝大家!
uj5u.com熱心網友回復:
另一種可能性是將 jq 的一次呼叫與一個實用程式的呼叫相結合,例如awk撰寫檔案:
jq -cr '(.root_rgs | "\(.[0]|sub("PROM_FD_";""))\(.[1]|sub("PROM_JOB";""))"),
{TARGETS: .targets}' input.json |
awk 'NR%2==1 {fn = $1 ".json"; next} {print $0 >> fn}'
當然,生成的檔案通常不會列印得很漂亮。
警告:以上附加到現有檔案。在實踐中,處理此類檔案的替代方法可能更可取。
uj5u.com熱心網友回復:
jq 本身不能寫入檔案,既不能寫入一個檔案,也不能寫入多個檔案。但是,呼叫 jq 的 shell 可以。因此,任何解決方案都需要通過將任務拆分為多個部分來協調這兩個級別,并且每個都由兩個級別之一(或任何第三方工具)執行。
一種直接的方法是使用 jq 將流分離為檔案,并準備好它們已經攜帶檔案的名稱和內容,并在 shell 中對該輸出進行迭代。然后,在每個迭代步驟中,可以再次使用 jq 來提取該資料并讓 shell 將內容保存到檔案中。
jq -c '{
name: "\(.root_rgs | map(split("_")[-1]) | join("_")).json",
content: {targets}
}' input.json | while read -r json; do
jq '.content' <<< "$json" > "$(jq -r '.name' <<< "$json")"
done
另一種方法是讓 jq 生成一個可在 shell 中執行的腳本。這會將必須呼叫 jq 的次數從 2n 1 減少到僅 1,如果輸入檔案包含許多檔案,這可能很重要。
jq -r '"cat"
" >\(.root_rgs | map(split("_")[-1]) | join("_")).json"
" <<<\({targets} | tojson | @sh)"
' input.json | bash
這會為輸入流中的每個檔案生成一行表單cat >FILENAME <<<'JSON',該行指示 shell 將cat其輸入檔案寫入檔案,該檔案又作為可理解的Here 字串提供bash,命令最終通過管道傳輸到該檔案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/403354.html
標籤:
下一篇:將經常更新的陣列保存到資料庫
