Powershell : Eine ganze Zeile löschen wenn eine Gruppe doppelt ist und nur eine 0 enthält ?

1 Antwort

Meine Testdatei (test.txt):

00222 04444 00573 00000 04444
00222 04444 00573 00000 40444
00222 00444 00573 00000 00444
00222 03211 04444 00573 00000 03211 04444
00222 01234 04444 00573 00000 40444
02222 01234 04444 00573 00000 40444 02222 

Die von Dir nicht vorgegebenen Zeilen dienen lediglich zum probieren was passiert wenn etwas passiert was Du nicht vorgedacht hast...

Die lange und kommentierte Version, damit Du auch verfolgen kannst was das Script in jedem Schritt tut.

$GoodLines = Get-Content 'test.txt'|
    ForEach-Object {
        #teste ob eine 0 gefolgt von keiner 0 am Beginn einer Zahlengruppe mehr  als einmal vorkommt
        $Hits = $_|Select-String -Pattern '\b0[1-9]\d+\b' -Allmatches  #erstmal feststellen ob überhaupt was  entsprechendes in der Zeile ist
        $HitCount = ($Hits.Matches.Value|Group-Object|#wie oft kommen die zutreffenden Zifferngruppen in der Zeile an häfigsten vor
            Sort-Object -Property Count  | #nach Count sortieren
            Select-Object -Last 1 ).Count  # nur der letzte (höchste) Wert ist entscheidend und  wird an die Variable übergeben


        Write-host mindestens eine Zifferngruppe hat $HitCount Treffer -fo mag
        if ($HitCount -lt 2) {
            Write-host Wird gespeichert: $_ -fo green
            $_  #Zeile an die Pipeline übergeben
        }
        else {
            Write-host Zeile wird geloescht: $_ -fo darkred
        }
        Write-Host `nNaechste Zeile
    }


'Das  wird in die Datei geschrieben:'
$GoodLines|Tee-Object 'OutputDatei.txt'
pause

es geht auch kürzer:

'Das wird in die Datei geschrieben:'
gc 'test.txt'|%{ if ((($_|Select-String '\b0[1-9]\d+\b' -a).Matches.Value|group|sort Count|select -l 1 ).Count -lt 2) {$_}}|tee 'OutputDatei.txt'

oder ohne tee:

gc 'test.txt'|%{ if ((($_|Select-String '\b0[1-9]\d+\b' -a).Matches.Value|group|sort Count|select -l 1 ).Count -lt 2) {$_}}>'OutputDatei.txt'

Das wichtigste ist ersmal das RegEx Suchpattern '\b0[1-9]\d+\b' :

  • \b Wortgrenze (kann alles außer Buchstaben und Zahlen sein, in deinem Fall einfach Leerzeichen)
  • eine 0
  • [1-9] Ziffer die keine 0 ist
  • \d+ mindestens eine belibige Ziffer
  • \b Wortgrenze

der Rest ist einfach ermitteln wie oft das Pattern innerhalb einer Zeile auf gleiche Zifferngruppen matched

verwendete Cmdlets:

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren