Powershell, a Contar de la cadena de ocurrences en un archivo de texto

Tengo un archivo de texto con el siguiente diseño,

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

Me debe desarrollar un script en Powershell V2 para contar las apariciones y construir un CSV con el siguiente contenido,

john,3
george,2
peter,1

Yo estaba pensando en bucle a través de los archivos de ahorro de cada usuario en una matriz y, a continuación, utilizar get-content y un patrón para contar el ocurrences, por ejemplo:

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

¿ Tiene sentido? Yo soy el oído abierto a sus sugerencias y consejos. Conocer el poder de Powershell estoy bastante de usuario hay un mejor enfoque. Gracias!

InformationsquelleAutor m0dest0 | 2012-12-21

2 Kommentare

  1. 3

    Con su actual enfoque que usted va a leer el archivo desde el disco una vez para cada usuario. Podría ser mejor para escanear el archivo una vez, y recoger todos los usuarios en un solo paso.

    Suena como que usted no tiene la lista de los usuarios antes de tiempo, básicamente necesitas para buscar cadenas como user:<username here> y mantener un listado de los diferentes nombres de usuario a encontrar.

    Aquí es una función que debe hacer el trabajo básico:

    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
    }

    Que, a Continuación, puede crear un archivo CSV como este:

    PS> GetUserCounts .\myfile.txt | Export-Csv .\counts.csv
  2. 0

    Aquí es otra opción de utilizar los Group-Object cmdlet:

    Get-Content lorem.txt | 
    Foreach-Object {$_ -replace '^.+user:(.+)$','$1' } | 
    Group-Object -NoElement

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea