Filtre uma lista de strings no powershell por um regex, depois agrupe e ordene por um dos grupos de captura

0

Estou procurando uma maneira de filtrar uma lista de strings no powershell por um regex, depois agrupar e classificar por um dos grupos de captura.

Imagine que minha lista é assim:

bogus0
ACBXYZ-0000 hello
bogus1
ACBXYZ-0000 hello again
bogus2
ACBXYZ-0001 world
bogus3
ACBXYZ-0001 world

Primeiro eu fiz isso:

$list | select-string "^(ACBXYZ-\d+)(.*)"

Quais saídas

ACBXYZ-0000 hello
ACBXYZ-0000 hello again
ACBXYZ-0001 world
ACBXYZ-0001 world

Então eu fiz isso:

$list | select-string "^(ACBXYZ-\d+)(.*)" | % { "$($_.Matches[0].Groups[1].Value), $($_.Matches[0].Groups[2].Value.Trim(' ,-'))" } | sort | group | select name

Quais saídas

Name
----
ACBXYZ-0000, hello
ACBXYZ-0000, hello again
ACBXYZ-0001, world

Mas, na verdade, gostaria de mostrar isso:

Name
----
ACBXYZ-0000, hello
ACBXYZ-0001, world

desde que a mensagem após o número é legal, mas não é realmente importante.

Alguma idéia?

PS: Consegui conseguir isso com um script mais complicado, mas estava procurando por um de uma linha.

    
por Alex 23.07.2016 / 01:24

1 resposta

0

O que você precisa é de uma tabela de hash para armazenar seus resultados. Uma tabela de hash é uma coleção de pares de valores-chave. No seu caso, as chaves serão as strings "ACBXYZ-0000", e os valores serão "hello" strings. As chaves nas tabelas de hash são únicas, exatamente o que precisamos aqui.

Por exemplo:

$myHash = @{}
$myHash["ACBXYZ-0001"] = "hi there"  # set a value
Write-Output $myHash["ACBXYZ-0001"]  # retrieve the value

Eu reescrevi seu script para usar uma tabela de hash aqui:

$list = gc text.txt
$out = @{}
$list | select-string "^(ACBXYZ-\d+)(.*)" | 
    % { $out[$_.Matches[0].Groups[1].Value] = $_.Matches[0].Groups[2].Value.Trim(' ,-') }
$out 

Isso dá isto:

Name                           Value                                                                                                           
----                           -----                                                                                                           
ACBXYZ-0000                    hello again                                                                                                     
ACBXYZ-0001                    world                                                                                                           

Você pode ver que o segundo "ACBXYZ-0000" substituiu o primeiro. Se você não gostar disso, pode verificar antes de armazenar uma chave para ver se ela existe na tabela de hash com $out.ContainsKey() .

Deixarei para você descobrir como gerar os resultados como uma lista classificada de strings. Deixe-me saber se você tem problemas.

Apenas por diversão, eu também reescrevi seu script para mais como eu faria:

$list = gc text.txt
$out = @{}
$list | % {
    if ($_ -match "^(ACBXYZ-\d+)(.*)") 
    { 
        $out[$matches[1]] = $matches[2].Trim(' ,-') 
    } 
}
$out
    
por 25.07.2016 / 03:08

Tags