2

私は比較的新しい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

このデータを取得/古いデータを破棄するにはどうすればよいですか?

4

2 に答える 2

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
于 2012-08-30T15:06:32.060 に答える
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時近くになります。真夜中から1秒後に「00:00:01」を指定する必要があります

于 2012-08-30T15:07:07.520 に答える