Powershell - 当2个字段匹配时添加结果

时间:2014-06-24 19:11:32

标签: powershell

我输入的数据如下:

Type    Site     Count
======================
Copper  Site1    10
Copper  Site1    7
Bronze  Site1    3
Bronze  Site1    9
Copper  Site2    32
Copper  Site2    1
Bronze  Site2    3
Bronze  Site2    13

我想要输出的是

Type    Site     Count
======================
Copper  Site1    17
Bronze  Site1    12
Copper  Site2    33
Bronze  Site2    16

我有以下代码:

Function getIndex($location)
{
  for($j = 0; $j -lt $result.Count; $j++) {
    if($result[$j].Location -contains "$location") {
      $index=$j
      break;
    }
  }
  return $index
}

for ($i=0; $i -lt $outarray.length; $i++) {
  $loc=$outarray[$i].Location
  $pcount=$outarray[$i].'Count'
  $ltype=$outarray[$i].'License Type'
  if(!($result | where-object {$_.Location -eq "$loc"})) {
    $result+=New-object psobject -property @{'Location' = $loc; 'Count' = $pcount; 'License Type' = $ltype}  
    } else {
      $index=getIndex($loc) 
      $result[$index].'Count' = $result[$index].'Count' + $pcount
   }
}

但是此代码生成的输出只包含一种类型和计数的错误计数。我尝试通过将其修改为如下所示来优化函数:

Function getIndex($location)
{
  for($j = 0; $j -lt $result.Count; $j++) {
    if($result[$j].Location -contains "$location" -and $result[$j].'License Type' -contains "$item.licensetype") {
      $index=$j
      break;
    }
  }
  return $index
}

由于数组索引被计算为null,导致我的索引操作失败。我觉得我在这里错过了一些非常简单的东西,但我无法弄明白。任何帮助是极大的赞赏!谢谢!

2 个答案:

答案 0 :(得分:2)

我使用Group-Object和Measure-Object来完成你想要的。首先按类型分组,并将变量分配给当前类型,以便稍后在自定义对象中使用。然后我按站点分组,对于每个站点,我得到计数​​的总和,并输出Type,Site和Sum作为自定义对象。我将您的测试数据设置为一个对象数组,就像您在帖子中一样。我将其命名为$Array

$array | group Type | %{
    $Type = $_.Name
    $_.group | group Site | %{
        [pscustomobject]@{
            Type=$Type
            Site=$_.Name
            Count=($_.Group|measure-object Count -sum).sum
        }
    }
}

这完全符合您的要求:

Type   Site  Count
----   ----  -----
Copper Site1    17
Copper Site2    33
Bronze Site1    12
Bronze Site2    16

答案 1 :(得分:0)

这应该有用。

$counts = Import-CSV "C:\Users\Public\Scripts\counts.csv"

$counts | Sort-Object Site, Type -Unique | Select-Object Type, Site, @{Name = 'Count'; Expression = { $obj=$_;($counts | Where-Object {(($obj.Type -eq $_.Type) -and ($obj.Site -eq $_.Site))} | Measure-Object Count -Sum).Sum } }