我有一個這種格式的大檔案:
{
"Name": "Alex",
"Id": 1,
"time": "2022-01-01T04:29:18.9099882Z"
}
{
"Name": "Homer",
"Id": 2,
"time": "2022-01-02T04:29:18.9099882Z"
}
{
"Name": "Bart",
"Id": 3,
"time": "2022-01-03T04:29:18.9099882Z"
}
如何按日期范圍和特定時間段過濾此檔案?我試圖使用 jq 解決這個問題,但無法這樣做。如果有另一種方法如何在沒有 jq 的情況下過濾它,請告訴我。
uj5u.com熱心網友回復:
簡單的不是select你想要的嗎?例如,使用純字串比較使簡單的日期范圍包含在左側和排除在右側:
jq 'select(.time > "2022-01-01" and .time < "2022-01-03")'
{
"Name": "Alex",
"Id": 1,
"time": "2022-01-01T04:29:18.9099882Z"
}
{
"Name": "Homer",
"Id": 2,
"time": "2022-01-02T04:29:18.9099882Z"
}
演示
您還可以將日期字串轉換為例如Unix 時間(“自紀元以來的秒數”),fromdate并將其作為數字進行操作(在使用sub截斷秒小數以獲得ISO 8601兼容日期之后):
jq 'select(.time | sub("\\.\\d "; "") | fromdate < 1641100000)'
{
"Name": "Alex",
"Id": 1,
"time": "2022-01-01T04:29:18.9099882Z"
}
{
"Name": "Homer",
"Id": 2,
"time": "2022-01-02T04:29:18.9099882Z"
}
演示
或者,為了另一個示例,使用strptime將日期轉換為分解陣列(按此順序包含:年、(從零開始)月、日、小時、分鐘、秒、星期幾和日期年),然后過濾例如星期一(1在(從零開始的)位置的該陣列中表示6):
jq 'select(.time | sub("\\.\\d "; "") | strptime("%FT%TZ") | .[6] == 1)'
{
"Name": "Bart",
"Id": 3,
"time": "2022-01-03T04:29:18.9099882Z"
}
演示
uj5u.com熱心網友回復:
一個powershell示例。將輸入作為陣列:
[{
"Name": "Alex",
"Id": 1,
"time": "2022-01-01T04:29:18.9099882Z"
},
{
"Name": "Homer",
"Id": 2,
"time": "2022-01-02T04:29:18.9099882Z"
},
{
"Name": "Bart",
"Id": 3,
"time": "2022-01-03T04:29:18.9099882Z"
}]
出于某種原因,在 powershell 5 中,我先使用括號來完成轉換(可能會占用大量記憶體)。時間欄位被轉換為 .Net [datetime] 型別,然后很容易比較它們。如果可以,比較的右側會自動轉換為日期時間。
(get-content file.json | convertfrom-json) |
foreach-object { $_.time = [datetime]$_.time; $_ } |
where-object { $_.time -ge '1/1/22' -and $_.time -le '1/2/22' }
Name Id time
---- -- ----
Homer 2 1/1/2022 11:29:18 PM
這是連續 json 物件的原始檔案的解決方法:
get-content file.json -ReadCount 5 |
foreach-object { $_ | convertfrom-json } |
foreach-object { $_.time = [datetime]$_.time; $_ } |
where-object { $_.time -ge '1/1/22' -and $_.time -le '1/2/22' }
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/415809.html
標籤:
上一篇:從多個遠程服務器匯出已安裝的補丁
