识别列表中存在的多个项目,并将其全部列出

时间:2018-07-24 06:08:26

标签: powershell

我有一个列表,其中重复了几个项目。我需要识别这些项目,并创建一个新列表以包括所有重复的项目,但是每次它们再次出现时。

以下是列表:

apple
orange
pear
carrot
tomato
cucumber
apple
apple
apple
cucumber
tomato

那是苹果x4,番茄x2,黄瓜x2和其余x1。

所需的新列表为:

apple
apple
apple
apple
tomato
tomato
cucumber
cucumber

这会删除仅存在一次的对象,并列出每次存在的不止一次的对象。

我尝试过:

$Fruits = Get-Content -Path C:\temp\Fruits.txt

$Unique = $Fruits | Select-Object -Unique
$MoreThanOne = Compare-Object –referenceobject $Unique –differenceobject $Fruits | Select-Object -ExpandProperty inputobject

$MoreThanOne

这将产生:

apple
apple
apple
cucumber
tomato

每种水果缺少一个。

有什么想法吗?

1 个答案:

答案 0 :(得分:8)

通过比较两个对象并保存差异,您基本上可以执行($Unique - "each entry once")。这是因为您想要保留所有条目的变量与保留每个条目一次的变量之间的区别。

对此提供了更好的解决方案Group-Object。这样会将所有条目分组在一起,以便您可以查找包含多个条目的条目。

命令Get-Content -Path C:\temp\Fruits.txt | Group-Object输出以下内容:

Count Name                      Group
----- ----                      -----
    4 apple                     {apple, apple, apple, apple}
    2 tomato                    {tomato, tomato}
    2 cucumber                  {cucumber, cucumber}
    1 carrot                    {carrot}
    1 pear                      {pear}
    1 orange                    {orange}

如果您现在过滤正确:

Get-Content -Path C:\temp\Fruits.txt | Group-Object | Where-Object {$_.Count -gt 1} | Select-Object -ExpandProperty Group

输出是这样的:

apple
apple
apple
apple
tomato
tomato
cucumber
cucumber