Board logo

标题: [转载代码] 使用PowerShell中的Sort-Object来完成排序 [打印本页]

作者: DAIC    时间: 2013-10-16 09:22     标题: 使用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




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2