按时间戳对行数组进行排序

时间:2019-12-18 07:18:38

标签: powershell

我有一个大数组(100k +行),应该排序。排序标准是行中的时间戳。天真的使用排序功能的方法不起作用。如何按日期/时间对其进行排序?

数组是文件内容。但是这个例子说明了如何弄错:

$a = @()
$a += "Line SystemTime LocalTime Facility Severity ID Message"
$a += "0 1/10/2019 14:30:30,639 1/9/2019 15:30:30,639 Data base        E ID:03590006 Init - Could not open file (lastError=0x00000037)"
$a += "2 1/9/2019 14:30:40,442 1/9/2019 15:30:40,442 FTP              W ID:035A001A select failed, err:10038. Shutdown FTP"
$a += "5 1/9/2019 14:30:30,639 1/9/2019 15:30:30,639 Data base        E ID:03590006 Could not connect to changed event."
$a += "3 1/9/2019 14:30:40,460 1/9/2019 15:30:40,460 Telnet           W ID:02FE000E select failed, err:10038. Shutdown Telnet"

$a | sort

时间戳前面的行号将被忽略。显然,sort cmdlet按字母顺序排序。我怎么知道它应该使用日期/时间?

1 个答案:

答案 0 :(得分:2)

如果您的数据是CSV,则最好的选择是使用ConvertFrom-CSV cmdlet将其转换为cmdlet并按所需属性对其进行排序。

在您的示例中,您可以在Sort-Object cmdlet中使用正则表达式来获取e。 G。第一个日期并将其转换为日期时间:

$a | Select-Object -Skip 1 | 
    Sort-Object { [datetime]($_ -replace '^\d*\s*([^,]+).*', '$1')}

注意:我不得不跳过标题(第一行)

输出:

5 1/9/2019 14:30:30,639 1/9/2019 15:30:30,639 Data base        E ID:03590006 Could not connect to changed event.
2 1/9/2019 14:30:40,442 1/9/2019 15:30:40,442 FTP              W ID:035A001A select failed, err:10038. Shutdown FTP
3 1/9/2019 14:30:40,460 1/9/2019 15:30:40,460 Telnet           W ID:02FE000E select failed, err:10038. Shutdown Telnet
0 1/10/2019 14:30:30,639 1/9/2019 15:30:30,639 Data base        E ID:03590006 Init - Could not open file (lastError=0x00000037)