Windows Powershell - náhodné řazení kolekce
Včera jsem kvůli jedné věci (vypsání tří náhodných řádků ze souboru) zkoumal, jak se dá v powershellu co nejsnadněji a nejrychleji seřadit kolekce (v mém případě řádků získaných cmdletem Get-Content (aliasy cat, gc a type).
Řešení je velice jednoduché a elegantní s použitím cmdletu Sort-Object, kterému se jako parametr pro řazení předá náhodné číslo (pro každý prvek v pipeline nové). Asi takhle -
[1] » $rand = New-Object System.Random
[2] » 1..15 | Sort-Object -Property {$rand.Next()}
3
1
10
6
7
5
9
2
13
4
14
8
15
12
11
Případně zkráceně (aliasy + vynechání default parametru + využití defaultního using System)
[3] » $rand = new Random
[4] » 1..15 | sort {$rand.Next()}
9
4
7
8
2
14
11
12
3
13
10
5
1
15
6
A dokonce jsem ve své instalaci objevil cmdlet Get-Random (s aliasem random), nejsem si jistý, jestli jsem ho získal v Powershell Community Extensions nebo je nový v Powershell 2.0 CTP. Nicméně nám umožňuje minulý kód ještě zkrátit.
[7] » 1..5 | sort {Get-Random}
4
2
3
1
5
Takže můj původní záměr se dá realizovat takto (dvě ukázky, aby byla vidět opravdu náhodnost) -
[8] » (cat ./bla.txt | sort {Get-Random})[0..2]
-- Dump completed on 2008-05-01 21:34:21
-- Host: localhost Database: bttechnik
-- Dumping data for table `contact`
[9] » (cat ./bla.txt | sort {random})[0..2]
CREATE TABLE `pages` (
-- Table structure for table `cars`
INSERT INTO `images` VALUES (1,'TestovaciObrazek.jpg',1,1),(3,'Obrazek.jpg',1,0);
Tags: Powershell, random, sort