- 帖子
- 2874
- 积分
- 7021
- 技术
- 336
- 捐助
- 0
- 注册时间
- 2011-6-2
|
[转载代码] 使用PowerShell中的Sort-Object来完成排序
最近都在关注PowerShell的新闻组, 某人求助如下:
I need to read the content of a file and sort the content by fixed width.
Example file: sample_data.txt
23abdc1133cdde
14zzwd0034kkhe
65ppok7780hyyh
Read in the content and sort text by fixed position
(startpos:1,len:2)(startpos:3,len:4)(startpos:6,len:4)
当然, 只有这三行代码没有太多意思, 我构建了如下的变量, 来让我们体会PowerShell中Sort-Object的强大.
PS C:\> $a = '103903/06/2006','104803/06/2006','102103-01-2006','112203-06-2007','122304-08-2006','112204-12-2007'
PS C:\> $a
103903/06/2006
104803/06/2006
102103-01-2006
112203-06-2007
122304-08-2006
112204-12-2007
|
这个字符串看起来真晕啊...排序比较key1是字符串的前两位, 排序比较key2是字符串3,4位. 最后所有的位是排序比较key3, key3实际是日期.
我将用这个看起来很混乱的字符串为你简单展示sort-object的两个强大特性:
1. 基于对象的比较;
2. 使用scriptblock来实现用户定义排序.
如下代码, 将根据最后10位所代表的日期, 对字符串进行排序:
PS C:\> $a | Sort-Object { [datetime]$_.substring(5) }
102103-01-2006
103903/06/2006
104803/06/2006
122304-08-2006
112203-06-2007
112204-12-2007
|
通过使用datetime类型, 将字符串转换成对象, 排序的格式就可以是任意的. 怎么样, 感觉好用嘛??有中文会怎么样呢??来看一眼
PS C:\> [datetime]'2006年3月1日'
2006年3月1日 0:00:00
|
太好了, 直接就被识别了, 很方便吧??
接下来, 我决定用key2减去key1的方式, 进行排序.
PS C:\> $a | sort { [int]$_.substring(2,2) - $_.substring(0,2) }
112203-06-2007
122304-08-2006
112204-12-2007
102103-01-2006
103903/06/2006
104803/06/2006
|
完成了, 这一次我编写了排序使用的scriptblock, 怎么样很方便吧??
最后我先按照key1排序, 之后用key3排序, 最后按照key2 - key1进行排序:
PS C:\> $a | sort {$_.substring(0,2)}, { [datetime]$_.substring(5) }, { [int]$_.substring(2,2) - $_.substring(0,2) }
102103-01-2006
103903/06/2006
104803/06/2006
112203-06-2007
112204-12-2007
122304-08-2006
|
可以说, sort-object别名sort的强大允许你构造复杂的排序规则, 通过scriptblock的能够避免很多额外的操作. 最后要提一点, 可以对hash表进行排序哦. 我就不在演示, 希望大家能看看get-help sort-object的说明.
http://blog.chinaunix.net/uid-9781829-id-1997706.html |
|