【问题标题】:Select multiple properties where one of the properties must be unique in a pipeline选择多个属性,其中一个属性在管道中必须是唯一的
【发布时间】:2020-06-05 16:05:46
【问题描述】:

使用Select-Object,您可以使用-Unique 选择对象的多次出现中的第一个。您也可以只选择一些要保留的属性。但是,如果我只想检查一个属性的唯一性,过滤掉所有非唯一的属性,而不是只留下其中一个,并允许其他属性不变地通过,该怎么办?具体来说,我有一个PSCustomObjects 列表,其中一个属性是基本名称,另一个是自动生成的缩短名称。我想过滤掉短名称多次出现的元素,但所有项目的基本名称都不同。 Select-Object 似乎不适合这个任务,但是什么是?

编辑:澄清 - 这应该是结果:

> $A = [PSCustomObject]@{A = 1; B = 2}, [PSCustomObject]@{A = 2; B = 2}, [PSCustomObject]@{A = 4; B = 1}
> $A

A B
- -
1 2
2 2
4 1

> $A | Mystery-Cmdlet "B"

A B
- -
4 1

【问题讨论】:

  • 您的意思是Select-ObjectWhere-Object 没有 -Unique 开关
  • 是的,对不起。我现在就修。
  • 可能是$A | Group-Object -Property B | Where-Object Count -eq 1 | Select-Object -ExpandProperty Group?
  • 您可以使用$a[2] 查看行,使用$a.a 查看特定列。这能回答你的问题吗?
  • @NekoMusume ...不,为什么会这样?

标签: arrays powershell filtering unique pipeline


【解决方案1】:

我有一个PSCustomObjects 的列表...
我想只检查一个属性的唯一性,过滤掉所有非唯一的属性并 不只是留下其中一个,并允许其他属性通过 通过不变...

让我们用 PowerShell cmdlet 重写上述要求:

$A = @'
A,B
1,2
2,2
4,1
5,4
'@ | ConvertFrom-Csv -Delimiter ','        # a list of PSCustomObjects

$A |
  Group-Object -Property B |               # check for the uniqueness,
    Where-Object Count -eq 1 |             # filter out all non-unique ones,
      Select-Object -ExpandProperty Group  # and pass through the rest unchanged

输出62219608.ps1

A B
- -
4 1
5 4

【讨论】:

    【解决方案2】:

    我认为你必须用代码来解决它

    $A = [PSCustomObject]@{A = 1; B = 2}, [PSCustomObject]@{A = 2; B = 2}, [PSCustomObject]@{A = 4; B = 1}
    
    $A | Add-Member -NotePropertyName Count -NotePropertyValue init
    
    for ($i=0; $i -lt $a.Length; $i++) {
    $a[$i].Count = ($A.B | Where-Object {$_ -eq $a[$i].B}).Count
    }
    
    $a | Where-Object {$_.Count -eq 1}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-11
      • 2011-06-29
      • 2013-02-02
      • 1970-01-01
      • 1970-01-01
      • 2011-07-27
      • 1970-01-01
      相关资源
      最近更新 更多