powershell中的分组/计数

时间:2014-05-15 17:26:27

标签: powershell

我有以下数据

SBA SUBJECT1 3138L3BK0|31.4|44.4
SBA SUBJECT1 3138L3BK1|31.4|44.4
SBA SUBJECT1 3138L3BK2|31.4|44.4
SBA SUBJECT1 3138L3BK0|31.4|44.4
SBA SUBJECT2 3138L3BK3|31.4|44.4
SBA SUBJECT2 3138L3BK3|31.4|44.4
SBA SUBJECT2 3138L3BK3|31.4|44.4
SBA SUBJECT2 3138L3BK4|31.4|44.4

我需要以下结果

SBA SUBJECT 1, Count = 3
SBA Subject 2, Count = 2

逻辑是。

  1. 取管道分隔行中的第一列。
  2. 根据最后一个空格
  3. 将字符串分成两部分
  4. 按第一部分分组并在第二部分中返回唯一项目的数量
  5. 到目前为止我有以下代码

    $p= import-csv filename.txt -delimiter "|" -Header ("cusip")
    $p | Group {$_.cusip.Substring(0,$_.cusip.LastIndexOf(" "))}
    

    但我似乎无法获得独特的数量。

2 个答案:

答案 0 :(得分:3)

看起来mjolinor在我之前得到了它,但这是一种稍微不同的方法。

gc FileName.txt | ?{$_ -match "^(SBA SUBJECT(?:1|2)).*?\|([^|]+?)\|(.*)"} | %{
    New-Object PSObject -Property @{
        CUSIP=$Matches[1]
        Col1=$Matches[2]
        Col2=$Matches[3]
    }
}|Group CUSIP|FT Name,Count -AutoSize

答案 1 :(得分:0)

这是使用正则表达式和哈希表的解决方案:

$ht=@{} 

get-content filename.txt | 
 foreach {
   $_ -match '^(\S+\s\S+)\s([^|]+)' > $null
   $ht[$Matches[1]] += @($Matches[2])
   }
$ht.keys | foreach {
 [PSCustomObject]@{Name= $_;Count=($ht[$_] | Get-Unique).count}
  } | ft -auto