Using the Measure-Object Cmdlet

Calculating Basic Statistics

The Measure-Object cmdlet provides a way to quickly generate statistics (count, average, sum, minimum and maximum values) for an object. For example, suppose we have the following text file, which lists user names and their score on … well, something (it doesn’t matter what):

Dan K. Bacon Jr.,64
Jean Philippe Bagel,89
Erzsébet Balázs,45
Martin Bankov,64
Peter Bankov,33
Angel Barbariol a,89
David Barber,88
Rob Barker,55
Miklós Barkóczi,86
Dave Barnett,56
Josh Barnhill,75
Adam Barr,33
Paula Barreto de Mattos,89
Gytis M. Barzdukas,62
Shai Bassli,87
Pilar Colome Bassols,24
Tomasz Bator,67
Shaun Beasley,77
Mark Bebbington,35
Anna Bedecs,78
Parry Bedi,86
Ann Beebe,64
Dick Beekman,74
Balázs Belinszki,79
Kostadin Belishky,55
Mason Bendixen,64
Almudena Benito,33
Ido Ben-Sachar,56
Wanida Benshoof,81

Suppose you’d like to calculate the number of scores, the average score, and the highest and lowest score. Believe it or not you can do all that with a single command:

Import-Csv c:\scripts\test.txt | Measure-Object score -ave -max -min

The command itself is pretty straightforward. We use the Import-Csv cmdlet to import data from the text file; that data is then piped to the Measure-Object cmdlet. On that side of the pipeline we call Measure-Object followed by the name of the property or item (in this case, score) that we want to generate statistics for. Notice, too that we include the -ave, -max, and -min parameters (leaving out-sum). That’s important: with the exception of count (the number of items in the dataset) you get back only those statistics specially included in the command.

Here’s what the returned data looks like:

Count    : 29
Average  : 65.1034482758621
Sum      :
Maximum  : 89
Minimum  : 24
Property : Score

Keep in mind that Measure-Object is used only for generating statistics; it doesn’t do things like show you the people who got, say, the five best scores. If you want that kind of information you need to sort the data and then use the Select-Object cmdlet, like so:

Import-Csv c:\scripts\test.txt | Sort-Object score -ascending | Select-Object -first 5

Here’s what that command returns:

Name                                    Score
----                                    -----
Paula Barreto de Mattos                 89
Angel Barbariol a                       89
Jean Philippe Bagel                     89
David Barber                            88
Shai Bassli                             87

And, yes, you can determine the five lowest scores: just use the exact same command but sort in ascending order (the default) rather than descending order:

Import-Csv c:\scripts\test.txt | Sort-Object score | Select-Object -first 5

Maybe this was a golf tournament, in which case these five people actually did quite well:

Name                                    Score
----                                    -----
Pilar Colome Bassols                    24
Peter Bankov                            33
Almudena Benito                         33
Adam Barr                               33
Mark Bebbington                         35