2012-08-30 37 views
2

我是一個相對較新的Powershell用戶,並且擁有我認爲是一個簡單的問題。我花了一些時間尋找類似的情況,並且出乎意料地沒有發現任何情況。我會發布我失敗的嘗試,但我甚至無法靠近!如何從基於最新日期的日誌文件中使用Powershell提取最新的行

我有一個重複數據的日誌文件,我想提取每個「唯一」條目的最新事件。問題在於每個條目由於個別日期戳而是唯一的。 「獨一無二」的標準是1欄 例如:

AE0440,1,2,3,30/08/2012,12:00:01,XXX 
AE0441,1,2,4,30/08/2012,12:02:01,XXX 
AE0442,1,2,4,30/08/2012,12:03:01,XXX 
AE0440,1,2,4,30/08/2012,12:04:01,YYY 
AE0441,1,2,4,30/08/2012,12:06:01,XXX 
AE0442,1,2,4,30/08/2012,12:08:01,XXX 
AE0441,1,2,5,30/08/2012,12:10:01,ZZZ 

因此輸出我想應該是(爲了不相關):

AE0440,1,2,4,30/08/2012,12:04:01,YYY 
AE0442,1,2,4,30/08/2012,12:08:01,XXX 
AE0441,1,2,5,30/08/2012,12:10:01,ZZZ 

我怎樣才能得到這個數據/丟棄舊數據?

回答

3

試試這個,它可能看起來有點神祕的第一次用戶。它讀取文件的內容,將行按唯一值分組(現在我們有3個組),每個組通過解析日期時間值(再次通過分割)進行排序,並返回第一個值。

Get-Content .\log.txt | Group-Object { $_.Split(',')[0] } | ForEach-Object {  
    $_.Group | Sort-Object -Descending { [DateTime]::ParseExact(($_.Split(',')[-3,-2] -join ' '),'dd/MM/yyyy HH:mm:ss',$null) } | Select-Object -First 1  
} 

AE0440,1,2,4,30/08/2012,12:04:01,YYY 
AE0441,1,2,5,30/08/2012,12:10:01,ZZZ 
AE0442,1,2,4,30/08/2012,12:08:01,XXX 
+0

感謝這兩者,我想我因爲缺乏[DateTime] :: ParseExact的知識而失望。我標記了Shay的答案,因爲我並不真的想添加標題,但兩者在跳轉到解決方案時都很有用。 –

+0

很高興你解決了你的問題。請注意,當使用'Import-Csv'的'-Header'參數時,您不會向文件添加標題。當文件*不包含頭文件時,您需要使用該參數,以便該cmdlet知道要爲每列命名。否則,它假定文件的第一行包含列名。 – latkin

1

假設你的數據看起來就像你的例子:

# you can give more meaningful names to the columns if you want. just make sure the number of columns matches 
$data = import-csv .\data.txt -Header Col1,Col2,Col3,Col4,Col5,Col6,Col7 

# sort all data by the timestamp, then group by the label in column 1 
$grouped = $data | sort {[DateTime]::ParseExact("$($_.Col6) $($_.Col5)", 'HH:mm:ss dd/MM/yyyy', $Null)} -Desc | group Col1 

# read off the first element of each group (element with latest timestamp) 
$grouped |%{ $_.Group[0] } 

這也假定您的時間戳是上一個24小時制。即您的所有樣本數據都接近中午12點,而不是午夜12點。午夜一秒後需要指定'00:00:01'

相關問題