Powershell - 过滤唯一值

时间:2012-03-22 15:10:15

标签: powershell powershell-v2.0

我有一个输入csv文件,其中的列包含类似于以下示例的信息:

805265
995874
805674
984654
332574
339852

我想基于前2个字符将唯一值提取到数组中,因此使用上面的示例我的结果将是:

80,99,98,33

我如何使用PowerShell实现这一目标?

5 个答案:

答案 0 :(得分:22)

使用Select-Object和参数-unique

$values = 
'805265',
'995874',
'805674',
'984654',
'332574',
'339852'

$values |
  Foreach-Object { $_.Substring(0,2) } |
  Select-Object -unique

如果需要转换为int,则只需将其转换为[int]

$ints = 
  $values |
  Foreach-Object { [int]$_.Substring(0,2) } |
  Select-Object -unique

答案 1 :(得分:15)

我会使用Group-Object cmdlet:

Import-Csv foo.csv | Group {$_.ColumnName.Substring(0,2)}

Count Name                      Group
----- ----                      -----
    2 80                        {805265, 805674}
    1 99                        {995874}
    1 98                        {984654}
    2 33                        {332574, 339852}

答案 2 :(得分:1)

您可以使用哈希表:

$values = @(805265,995874,805674,984654,332574,339852)

$ht = @{}

$values |foreach {$ht[$_ -replace '^(..).+','$1']++}

$ht.keys

99
98
33
80

答案 3 :(得分:0)

您可以使用包含前两个字符的项目创建一个新数组,然后使用Select-Item为您提供这样的唯一项目:

$newArray = @()
$csv = import-csv -Path C:\your.csv
$csv | % {
    $newArray += $_.YourColumn.Substring(0,2)
}
$newArray | Select-Object -Unique

答案 4 :(得分:0)

另一种替代使用Select-Object -unique的方法是使用Get-Unique cmdlet(或其别名gu,请参见detailed description here),如下所示:

$values = @(805265,995874,805674,984654,332574,339852)
$values | % { $_.ToString().Substring(0,2) } | Get-Unique
# or the same using alias
$values | % { $_.ToString().Substring(0,2) } | gu