我嘗試合并包含此類資料的不同 JSON 檔案:
#file1:
{
"user1": {
"server1": 7.2,
"server2": 10.3
},
"user2": {
"server1": 15
}
}
#file2:
{
"user1": {
"server1": 8.5,
"server3": 20.5
},
"user3": {
"server1": 28
}
}
依此類推(每小時 12 次)。
這些資料是服務器使用百分比的用戶串列,每 5 分鐘演變一次(根據資源使用情況,用戶可能會消失和重新出現)。
我在 Linux 下,我使用不同的 Shell 工具生成這些檔案,例如jq.
我的目標是每小時獲得一個合并檔案,其中所有可用資料的平均負載是這樣的(僅考慮上面的 2 個檔案):
#result:
{
"user1": {
"server1": 7.85,
"server2": 5.15,
"server3": 10.25
},
"user2": {
"server1": 7.5
},
"user3": {
"server1": 14
}
}
我用命令嘗試了幾個查詢reduce,但沒有按預期作業。
也許最好的方法應該決議每個檔案,提取資料并將用戶存盤在不同的檔案中,然后合并所有資料?
感謝您的分析和示例。
uj5u.com熱心網友回復:
這是任意數量的輸入檔案的解決方案。它首先將每個值除以輸入檔案的數量,然后將它們全部相加,保留鍵:
jq -s '
.[][][] /= length
| reduce (.[] | to_entries[]) as $u ({};
reduce ($u.value | to_entries[]) as $s (.;
.[$u.key][$s.key] = $s.value
)
)
' file*
{
"user1": {
"server1": 7.85,
"server2": 5.15,
"server3": 10.25
},
"user2": {
"server1": 7.5
},
"user3": {
"server1": 14
}
}
演示
除法也可以通過在開頭使用變數來轉換為加法:
jq -s '
length as $c
| reduce (.[] | to_entries[]) as $u ({};
reduce ($u.value | to_entries[]) as $s (.;
.[$u.key][$s.key] = $s.value / $c
)
)
' file*
演示
uj5u.com熱心網友回復:
一種方法:
jq -n \
--argjson d1 file1.json \
--argjson d2 file2.json \
'
$d1 * $d2 |
with_entries(
.key as $user |
.value = (
with_entries(
.key as $server |
.value | ( $d1[ $user ][ $server ] $d2[ $user ][ $server ] ) / 2
)
)
)
'
jqplay上的演示
$d1 * $d2創建正確的結構,但使用錯誤的值。然后我們修復這些值。
另一種方法:
jq -s '
length as $n |
reduce ( .[] | to_entries[] ) as $_ ( { };
$_.key as $user |
reduce ( $_.value | to_entries[] ) as $_ ( .;
$_.key as $server |
.[ $user ][ $server ] = $_.value / $n
)
)
' file1.json file2.json
jqplay上的演示
這個適用于兩個以上的檔案!
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/445827.html
