从PowerShell数组中删除重复的值


Answers:


193

与开关一起使用Select-Object(别名为select-Unique;例如:

$a = @(1,2,3,4,5,5,6,7,8,9,0,0)
$a = $a | select -Unique

9
太简单了:-(.。在PowerShell 2中,如果您的数组已经排序,也可以使用Get-Unique(或gu
。– Joey

2
Johannes,Get-Unique在v1中可用:)
Shay Levy

2
很酷,这很好用,只是一个注释,如果您想简明扼要,甚至可以将其缩短为-uselect -u我会在命令行上使用它,但是用代码编写,建议使用完整的PS措辞:Select-Object -Unique
papo

这仅适用于一位数字吗?对于大量的数组,似乎不起作用。
EagleDev

85

另一种选择是将开关Sort-Object(其别名为sort,但仅在Windows上)与
-Unique开关配合使用,该开关将排序与删除重复项结合在一起:

$a | sort -unique

2
这也解决了我的下一个问题,即如何对其进行排序。谢谢!
注册用户

2
这看起来也快一点。
Gneo Pompeo

7

如果您想得到全面的炸弹证明,这是我的建议:

@('Apples', 'Apples ', 'APPLES', 'Banana') | 
    Sort-Object -Property @{Expression={$_.Trim()}} -Unique

输出:

Apples
Banana

这使用Property参数首先Trim()输入字符串,因此多余的空格将被删除,然后仅选择-Unique值。

有关更多信息Sort-Object

Get-Help Sort-Object -ShowWindow

1
很棒的答案。解决了我的问题,Get-Unique由于空格而无法正常工作
Kolob Canyon'Nov

7
$a | sort -unique

这适用于不区分大小写的项目,因此可以删除大小写不同的重复字符串。解决了我的问题。

$ServerList = @(
    "FS3",
    "HQ2",
    "hq2"
) | sort -Unique

$ServerList

以上输出:

FS3
HQ2

这也适用于具有多个成员的阵列
JoeRod


2

用我的方法,您可以完全删除重复的值,只剩下计数为1的数组中的值。目前尚不清楚这是否是OP真正想要的,但是我无法在线找到此解决方案的示例,因此这里是。

$array=@'
Bananna
Apple
Carrot
Pear
Apricot
Pear
Bananna
'@ -split '\r\n'

($array | Group-Object -NoElement | ?{$_.count -eq 1}).Name

2

无论您使用的SORT -UNIQUESELECT -UNIQUE还是GET-UNIQUEPowershell 2.0到5.1,给出的所有示例都在单个列数组上。我还没有使它能够在具有多个列的数组上起作用,以删除重复的行,从而在所述列上留下单个出现的行,或者开发替代的脚本解决方案。相反,这些cmdlet仅返回一次发生的Array中的Rows(具有奇异的出现),并转储具有重复项的所有内容。通常,我必须从Excel的最终CSV输出中手动删除重复项以完成报告,但是有时我想在删除重复项后继续在Powershell中使用所述数据。


这是Where-Object派上用场的地方。首先,使用正确的where子句缩小列表的范围,然后将其通过管道传递到排序对象,选择一个或多个要排序的列,然后为排序对象指定-unique。
LPChip
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.