marcusx
Goto Top

Powershell: Zeilen kürzer als 12 länger als 20 aussortieren

Ich versuche gerade 2 große Text Datei zu verbinden, doppelte Zeilen zu löschen und alle Zeilen die kürzer als 12 und länger als 20 sind auszusortieren.

Ich habe folgendes schon raus gefunden:

Alle Text Dateien in dem Ordner Test werden zu einer Output.txt
Get-Content "D:\test\*.txt" -Force | Set-Content "D:\test\output.txt"  

Der Output wird hiermit auf doppelte einträge überprüft und in Output2 gespeichert
Get-Content "D:\test\output.txt" -Force | Select-Object -Unique | Set-Content "D:\test\output2.txt"  

Hier dachte ich er entfernt alles länger als 20 aber er zählt nur irgend etwas:
Select-String 'D:\test\output2.txt' -Pattern ".{20}" | select -Expand LineNumber  

Könnt ihr mir da helfen, ich bin ein Totaler anfänger was PowerShell betrifft.
Wenn man das alles auch noch in eine Zeile bekommen könnte mit einem Durchlauf wäre das Genial.

Danke,

Marcus

Content-ID: 7534038959

Url: https://administrator.de/forum/powershell-zeilen-kuerzer-als-12-laenger-als-20-aussortieren-7534038959.html

Ausgedruckt am: 25.03.2025 um 06:03 Uhr

7426148943
Lösung 7426148943 15.06.2023 aktualisiert um 09:56:25 Uhr
Goto Top
Moin.
Get-Content "D:\test\*.txt" | select -Unique | ?{$_ -match '^.{12,20}$'} | Set-Content "D:\output.txt"  
oder ohne Regex so
Get-Content "D:\test\*.txt" | select -Unique | ?{$_.Length -ge 12 -and $_.Length -le 20} | Set-Content "D:\output.txt"  
oder so geht's auch
Get-Content "D:\test\*.txt" | select -Unique | ?{$_.Length -in (12..20)} | Set-Content "D:\output.txt"  
Oder noch einer
Select-String -Path "D:\test\*.txt" -Pattern "^.{12,20}$" | Select -Unique -Expand Line | Set-Content "D:\output.txt"  

Zeppel
TK1987
Lösung TK1987 15.06.2023 um 09:51:27 Uhr
Goto Top
Moin Marcus,

Zitat von @marcusx:
Alle Text Dateien in dem Ordner Test werden zu einer Output.txt
Get-Content "D:\test\*.txt" -Force | Set-Content "D:\test\output.txt"  
hier ist ein kleiner Denkfehler drin: Wenn du das Skript mehrfach laufen lässt, würde "D:\test\*.txt" auch auf die Ausgabedatei "D:\test\output.txt" zutreffen.

Get-Content ist hier überflüssig, man kann die Zeilen direkt mit Select-String filtern.
Select-String -Pattern "^.{12,20}$" "C:\Pfad\zu\Textdatei1.txt","C:\Pfad\zu\Textdatei2.txt" | Select -Unique -ExpandProperty Line | Set-Content "C:\Pfad\zur\Outputdatei.txt"  

Gruß Thomas
marcusx
marcusx 15.06.2023 aktualisiert um 14:10:54 Uhr
Goto Top
Hallo ihr beiden, super lieb von euch. Ich habe jetzt nur das von TK1987 ausprobiert und es klappt super.
Ist auch schön das man hier als Fragesteller nicht verflucht wird wie in manchen stockov... Hilfeseiten ^^

Welchen Wert müsste ich hinzufügen wenn ich das ganze jetzt noch nach Zufall oder A - Z Sortieren möchte?

Und habt ihr eine Idee wie ich bei Dateien vorgehe die sehr groß sind und scheinbar auch nach 30 min noch nicht gespeichert sind, trotz sehr schneller festplatte?
7426148943
7426148943 15.06.2023 aktualisiert um 14:27:26 Uhr
Goto Top
Zitat von @marcusx:
Welchen Wert müsste ich hinzufügen wenn ich das ganze jetzt noch nach Zufall oder A - Z Sortieren möchte?
Sort-Object dazwischen schalten
Select-String -Path "D:\test\*.txt" -Pattern "^.{12,20}$" | Select -Unique -Expand Line | Sort-Object | Set-Content "D:\output.txt"  
Und habt ihr eine Idee wie ich bei Dateien vorgehe die sehr groß sind und scheinbar auch nach 30 min noch nicht gespeichert sind, trotz sehr schneller festplatte?
Für wirklich große Files nutze ich stattdessen immer sed da hat Powershell von der Geschwindigkeit her keine Chance
#!/bin/bash
sed -nre '/^.{12,20}$/p' /folder/*.txt | sort -u >output.txt  
marcusx
marcusx 15.06.2023 um 14:33:43 Uhr
Goto Top
Sort-Object hast du hier nicht definiert, was wie sortiert wird oder?
Hast du für sed mehr infos für mich?

danke
7426148943
7426148943 15.06.2023 aktualisiert um 14:36:01 Uhr
Goto Top
Zitat von @marcusx:

Sort-Object hast du hier nicht definiert, was wie sortiert wird oder?
Wird per Default nach String Aufsteigend sortiert, für absteigend benutzt du den Parameter -Descending
Mehr siehe Doku
Hast du für sed mehr infos für mich?
https://www.geeksforgeeks.org/sed-command-in-linux-unix-with-examples/
https://www.ionos.de/digitalguide/server/konfiguration/linux-sed-befehl/
https://gnuwin32.sourceforge.net/packages/sed.htm
marcusx
marcusx 15.06.2023 um 14:36:53 Uhr
Goto Top
Zufall ist also so richtig?
Select-String -Path "D:\test\*.txt" -Pattern "^.{12,20}$" | Select -Unique -Expand Line | Sort-Object -Unique   
 | Set-Content "D:\output.txt"  

Z-A:
Select-String -Path "D:\test\*.txt" -Pattern "^.{12,20}$" | Select -Unique -Expand Line | Sort-Object   
 -Descending | Set-Content "D:\output.txt"  

richtig?
7426148943
7426148943 15.06.2023 aktualisiert um 14:43:05 Uhr
Goto Top
Zitat von @marcusx:

Zufall ist also so richtig?
Select-String -Path "D:\test\*.txt" -Pattern "^.{12,20}$" | Select -Unique -Expand Line | Sort-Object -Unique | Set-Content "D:\output.txt"  
Das ist nicht Zufall, es kommt so raus wie es aus den Dateien kommt
Z-A:
Select-String -Path "D:\test\*.txt" -Pattern "^.{12,20}$" | Select -Unique -Expand Line | Sort-Object -Descending | Set-Content "D:\output.txt"  
So ist es nach String absteigend (Z-A).

RTFM!! da steht's doch?!
marcusx
marcusx 15.06.2023 um 14:45:24 Uhr
Goto Top
Ich habe -Unique falsch verstanden dachte es heißt per Zufall aber es macht sind, das es bedeutet das es doppelte entfernt, per zufall finde ich nicht auf der seite. Danke dir.
7426148943
Lösung 7426148943 15.06.2023 aktualisiert um 15:10:03 Uhr
Goto Top
Zitat von @marcusx:
per zufall finde ich nicht auf der seite. Danke dir.
Zufall/Random kannst du mit bspw. mit Get-Random machen
Select-String -Path "D:\test\*.txt" -Pattern "^.{12,20}$" | Select -Unique -Expand Line | get-random -Count ([Int32]::MaxValue) | Set-Content "D:\output.txt"  
marcusx
marcusx 15.06.2023 um 15:37:06 Uhr
Goto Top
Die frage passt jetzt nicht ganz hierzu aber ich will nicht extra ein neues Thema öffnen, PowerShell packt die Dateigröße nicht irgendwann steht dort einfach, dass schon auf die Datei zugegriffen wird. Ich habe es auch mit Kali Linux versucht und mit linux befehlen, es wird auch eine output.txt erzeugt aber ohne Inhalt und es passiert nichts weiter. Imgrunde läuft Kali Linux ja auch nur über PowerShell.

Meine Frage was würdet ihr mir empfehlen das ich besser damit arbeiten kann? Ich überlege schon Linux in VirtualBox aufzusetzen aber wird problematisch die Dateien immer hin und her zu kopieren und ein Share Ordner ist auch nicht unbedingt effektiv. Ich arbeite auch mit KI und habe da öfter dieselben probleme weil Windows einfach limitiert ist.

Falls Linux, welches Linux sollte ich nutzen für solche sachen und KI sachen die mit meiner Nvidia RTX kompatibel sind (falls die das in Linux überhaupt ist)?
7426148943
7426148943 15.06.2023 aktualisiert um 15:52:40 Uhr
Goto Top
Schnapp dir doch einfach das oben verlinkte sed für windows oder aktiviere das in Windows bereits integrierte WSL
https://learn.microsoft.com/en-us/windows/wsl/install
Feddisch, braucht es keine VM für ...