Powershell : Eine ganze Zeile löschen wenn eine Gruppe doppelt ist und nur eine 0 enthält ?
Moin,
Ich suche eine Formel für powshell.
Es soll eine Datei geladen werden und danach überschrieben werden, wenn die Sortierung durch ist.
Eine Datei hat zum Beispiel:
10.000 zeilen die alle so aufgebaut sind:
50 zahlen dann ein Leerzeichen, 50 zahlen+ Leerzeichen,50 zahlen+ Leerzeichen,50 zahlen+ Leerzeichen,50 zahlen,
Ich möchte nun das zb, das jede Zeile gelöscht wird, wenn in eine von diesen 5 Gruppen doppelt ist.
Aber auf doppelt wird erst geprüft wenn die "0" nur einmal vorhanden ist.
Zb: mit 5 zahlen:
Wird gelöscht wegen 04444:
00222 04444 00573 00000 04444
Wird nicht gelöscht:
Eine 0, aber nicht identisch:
00222 04444 00573 00000 40444
Zwei 0, aber identisch:
00222 00444 00573 00000 00444
Lg und vielen dank an jeden der da für kurz Zeit findet😊
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:
- https://learn.microsoft.com/de-de/powershell/module/microsoft.powershell.management/get-content?view=powershell-5.1
- https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/select-string?view=powershell-5.1
- https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/sort-object?view=powershell-5.1
- https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/group-object?view=powershell-5.1
- https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/select-object?view=powershell-5.1
- https://learn.microsoft.com/de-de/powershell/module/microsoft.powershell.utility/tee-object?view=powershell-5.1