3

我得到了一个具有以下布局的文本文件,

Lorem Ipsum Lorem Ipsum Ipsum user:john
Lorem Ipsum user:peter
Lorem Ipsum Lorem Ipsum user:george
Lorem Ipsum user:john
Lorem Ipsum  vLorem Ipsum user:george
Lorem Ipsum user:john

我必须在 Powershell V2 上开发一个脚本来计算出现次数并构建一个包含以下内容的 CSV,

john,3
george,2
peter,1

我打算循环遍历将每个用户保存在数组中的文件,然后使用 get-content 和模式来计算出现次数,例如:

#assumming i was able to fill the array in some way :)
$users =@('john','peter', 'george')
for each ($user in $users)
{
     $count = get-content .\myfile.txt | select-string -pattern "user:$user"
     write-host $count
}
#save the CSV

这有意义吗?我对你的提示和技巧很感兴趣。了解 Powershell 的强大功能,我是一个非常好的用户,有更好的方法。谢谢!

4

2 回答 2

3

使用您当前的方法,您将为每个用户从磁盘读取一次文件。扫描一次文件并一次性收集所有用户可能会更好。

听起来您没有提前获得用户列表,您基本上需要扫描字符串,user:<username here>并保持对您找到的不同用户名的运行记录。

这是一个应该完成基本工作的函数:

function GetUserCounts($fileName)
{
  $userCounts = @{}

  switch -regex -file $fileName
  {
    '\buser:([a-zA-Z]+)\b' {
       $userName = $matches[1]
       $userCounts[$userName] = [int]$userCounts[$userName] + 1
    }
  }

  $userCounts.GetEnumerator() | select Name,Value
}

那然后你可以像这样创建一个CSV:

PS> GetUserCounts .\myfile.txt | Export-Csv .\counts.csv
于 2012-12-21T23:09:58.203 回答
0

Group-Object这是使用cmdlet的另一个选项:

Get-Content lorem.txt | 
Foreach-Object {$_ -replace '^.+user:(.+)$','$1' } | 
Group-Object -NoElement
于 2012-12-22T09:14:55.107 回答